使用反射后去除对象

本文关键字:对象 反射 | 更新日期: 2023-09-27 18:31:47

我一直在尝试用字符串调用方法,但一个副作用是每次按下按钮时都会创建一个新对象。我怎样才能摆脱这个?我尝试使用空,但没有运气。

第一次尝试:

string methodName = cboOriginal.Text + "To" + cboConverted.Text;
Type numeralType = typeof(NumeralSystemConversion);
ConstructorInfo numeralConstructor = numeralType.GetConstructor(Type.EmptyTypes);
object numeralObject = numeralConstructor.Invoke(new object[] { });
MethodInfo numeralMethod = numeralType.GetMethod(methodName);
object numeralValue = numeralMethod.Invoke(numeralObject, new object[] { txtOriginal.Text });
txtConverted.Text = numeralValue.ToString();
numeralType = null; numeralConstructor = null; numeralObject = null;
numeralMethod = null; numeralValue = null;

第二次尝试:

string methodName = cboOriginal.Text + "To" + cboConverted.Text;
convert = typeof(NumeralSystemConversion).GetMethod(methodName).Invoke(typeof(NumeralSystemConversion).GetConstructor(Type.EmptyTypes).Invoke(new object[] { }), new object[] { txtOriginal.Text });
txtConverted.Text = convert.ToString();
convert = null;

"转换"对象是在应用启动时创建的。NumeralSystemConversion是我创建的一个类,方法位于其中。

我看到的是,每次按下按钮时,诊断工具(Visual Studio 2015 社区)中的内存使用量都会增加。

使用反射后去除对象

我看到的最大"清理"是创建两个object数组一次(在启动时)并将它们存储在成员变量中:

object[] param1 = new object[] { };
object[] param2 = new object[] { null };

然后在您的方法中:

param2[0] = txtOriginal.Text;
convert = typeof(NumeralSystemConversion).GetMethod(methodName)
    .Invoke(typeof(NumeralSystemConversion).GetConstructor(Type.EmptyTypes)
    .Invoke(param1), param2);
param2[0] = null;

我认为您无法阻止它创建string。恐怕这就是做生意的成本。使用显式StringBuilder作为另一个类成员可能会有所帮助:

StringBuilder methodNameBuilder = new StringBuilder();

在您的函数中:

methodNameBuilder.Clear();
methodNameBuilder.Append(cboOriginal.Text);
methodNameBuilder.Append("To");
methodNameBuilder.Append(cboConverted.Text);
string methodName = methodNameBuilder.ToString();

最后,你看到的内存增加可能只是垃圾,在这种情况下,GC.Collect();应该清理它们。但在这种情况下,最好不要管它。