使用反射后去除对象
本文关键字:对象 反射 | 更新日期: 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();
应该清理它们。但在这种情况下,最好不要管它。