[英]C# constructing generic method
var leftCurrent = leftArray.GetValue(i);
var rightCurrent = rightArray.GetValue(i);
var mi = typeof (PropertyCompare).GetMethod("NotEqualProperties");
mi.MakeGenericMethod(leftCurrent.GetType());
var notEqualProps = mi.Invoke(null,new []{leftCurrent, rightCurrent});
if(notEqualProps != null)
result.Add(new ArraysDiffResult(i, notEqualProps as List<string>));
为什么此代码会引发InvalidOperationException(无法对ContainsGenericParameters为true的类型或方法执行后期绑定操作。)?
NotEqualProperties是静态的泛型方法。
UPD:我已经找到解决方案。 只是忘记分配新的MethodInfo ...(Epic Fail ..)
但是性能如何?
MakeGenericMethod
返回一个新的MethodInfo
实例。 ( MethodInfo
是不可变的)
您的代码创建了这个新实例,将其丢弃,然后继续使用打开的(非参数化) MethodInfo
。
您需要使用新实例,如下所示:
mi = mi.MakeGenericMethod(leftCurrent.GetType());
是; 反射比普通方法调用慢得多。
但是,除非您以紧密的循环调用它,否则不一定是问题。
您没有分配的结果
mi.MakeGenericMethod(leftCurrent.GetType());
到任何东西。 请注意, MakeGenericMethod
不会使调用实例发生变异。
PS此代码是否比直接调用方法(没有mi.Invoke)要慢得多?
许多? 我不知道。 唯一了解的方法是设置性能基准并进行概要分析。
哦,我很蠢...应该是:
mi = mi.MakeGenericMethod(leftCurrent.GetType());
(Facepalm ...)。 但是性能如何?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.