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 ..)但性能怎么样?
答案 0 :(得分:1)
MakeGenericMethod
会返回一个新的MethodInfo
实例。 (MethodInfo
是不可变的)
您的代码会创建此新实例,将其抛弃,然后继续使用open(非参数化)MethodInfo
。
您需要使用新实例,如下所示:
mi = mi.MakeGenericMethod(leftCurrent.GetType());
是;反射比普通的方法调用要慢得多 但是,除非你在一个紧凑的循环中调用它,否则它不一定是个问题。
答案 1 :(得分:1)
您没有分配
的结果mi.MakeGenericMethod(leftCurrent.GetType());
任何事情。请注意,MakeGenericMethod
不会改变调用实例。
P.S这个代码比直接调用方法慢得多(没有mi.Invoke)吗?
多少?我不知道。唯一的方法是设置性能基准和分析。
答案 2 :(得分:1)
哦,我很蠢......应该是:
mi = mi.MakeGenericMethod(leftCurrent.GetType());
(捂脸...)。 但是性能呢?