c# – 如果我在一个封闭的泛型类型上有一个MethodInfo,那么有一种简单的方法来切换这些类型吗?

假设我有类似Nullable< int> .HasValue的methodInfo.
无论如何将其转换为Nullable< string> .HasValue?

我知道一个常规的泛型方法我可以做methodInfo.GetGenericmethod()但我没有看到一种方法来为该方法的类型做,而不需要做更多的反射开销.如果我已经有了这个方法,为什么我要再次反思?

有趣的是,这些方法都具有相同的MetadataToken,这使得更令人印象深刻的是,不知何故,Module.ResolveMember似乎正在推出正确的方法.

有没有办法用Module.ResolveMethod做到这一点?本质上,方法和类型都可以具有通用参数,我可能需要切换它们.由于MethodInfo始终表示其标记相同且标记表示MethodInfo是该方法的最开放版本.我只需要将它转换为我的类型.

编辑:
更多的挖掘,看起来像List< T> .Add,List< int> .Add元数据令牌,我从中检索实际上生活在我的模块中,而通用定义存在于不同的模块中.

一旦我检索成员,我真的不想做反射,因为很难解决调用的完全相同的方法.

好吧也许我只是愚蠢,但为什么这不起作用::

var methodinfo = typeof(List<int>).getmethod("Add");
var handle = methodinfo.MetaDataToken;
var methodinfo2 = methodinfo.Module.ResolveMethod(handle,new []{typeof(string)},null);

为什么methodInfo2说它是Add(T)而不是Add(string)?

解决方法

您可以使用MethodBase.getmethodFromHandle在一行中完成它,但是为了使用此方法,您必须传递typeof(List< string>)而不仅仅是typeof(string).
var methodinfo = typeof(List<int>).getmethod("Add");
var methodinfo2 = MethodBase.getmethodFromHandle(methodinfo.MethodHandle,typeof (List<string>).TypeHandle);

Console.WriteLine(methodinfo);
Console.WriteLine(methodinfo2);

链接包括上述示例以及ResolveMethod无法工作的原因.

https://www.re-motion.org/blogs/mix/archive/2009/08/12/trying-to-resolve-a-method-in-a-closed-generic-type.aspx

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...