C#构造泛型方法

时间:2010-12-13 16:35:12

标签: c# runtime generics

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 ..)

但性能怎么样?

3 个答案:

答案 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());

(捂脸...)。 但是性能呢?