繁体   English   中英

C#构造通用方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM