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

Mic*_*l B 8 c# reflection

假设我有类似于methodInfo的方法Nullable<int>.HasValue.无论如何将其转换为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);
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*eff 10

你可以在一行中完成它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);
Run Code Online (Sandbox Code Playgroud)

此链接包括上述示例以及为什么ResolveMethod不起作用的说明.

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

  • 此方法还可以获取与封闭泛型类型中的给定方法相对应的开放泛型类型中的方法的“MethodInfo”。但请注意,“FieldInfo.GetFieldFromHandle”不能以这种方式工作,您必须使用“typeof(Generic&lt;other&gt;).GetField (field.Name, ...)”。 (2认同)