目前我正在使用一些静态数组来避免为采用数组的反射方法创建垃圾:
public static readonly object[]
OneObject = new object[1],
TwoObjects = new object[2];
然后我用它们像:
public void Write(BinaryWriter writer, object value)
{
Reflection.TwoObjects[0] = writer;
Reflection.TwoObjects[1] = value;
WriteMethod.Invoke(null, Reflection.TwoObjects);
}
大部分时间这都没问题,但它为多线程错误打开了大门。
有没有更好的方法来实现这一点而不需要在整个地方分配微小的阵列?
答案 0 :(得分:2)
如果您知道底层方法的签名,则可以创建强类型委托并改为调用它。例如(假设method
是一个MethodInfo
实例,表示返回void
并以BinaryWriter
和object
作为参数的静态方法:
var myMethod = (Action<BinaryWriter, object>)Delegate.CreateDelegate(typeof(Action<BinaryWriter, object>), method);
myMethod(writer, obj);
这样做的另一个好处是,调用委托不会产生与MethodInfo.Invoke
引发相同的性能开销。