如何从封闭泛型类型获取泛型方法,从开放泛型类型打开MethodInfo?

时间:2010-09-24 23:12:45

标签: c# generics reflection

想象一下这样的类型(C#):

public interface IAmGeneric<T>
{
   void SoAmI<T1>(T one, T1 two);
}

鉴于我已从类型(MethodInfo)的开放通用版本和以下数组中打开通用IAmGeneric<>.SoAmI<>()

new[] { typeof(int), typeof(string) }'

我正在寻找表现良好且可靠的方法来获取MethodInfo这样的封闭版本:

IAmGeneric<int>.SoAmI<string>()

更新:

可靠我的意思是它应该处理当方法不公开,有十几个重载,使用基类型的通用参数,而不仅仅是它的直接接口等的情况。

3 个答案:

答案 0 :(得分:1)

是这样的吗?不确定你正在寻找什么,也许扩展你的问题...这肯定需要添加一些检查(如检查声明类型是通用的/如果方法是通用的,等等)

var method = typeof(IAmGeneric<>).GetMethod("SoAmI");
var types = new[] { typeof(int), typeof(string) };


var methodTypeParams = method.GetGenericArguments();
var fullType = method.DeclaringType.MakeGenericType(types.Take(types.Length - methodTypeParams.Length).ToArray());
var fullMethod = fullType.GetMethod(method.Name).MakeGenericMethod(types.Skip(types.Length - methodTypeParams.Length).ToArray());

答案 1 :(得分:1)

这是一个非常复杂的案例:

public interface IAmGeneric<T>
{
    void SoAmI<T1, T2>(T one, T1 two, T2 three);
    void SoAmI<T1, T2>(T one, T2 two, T1 three);
    void SoAmI<T1, T2>(T1 one, T two, T2 three);
    void SoAmI<T1, T2>(T2 one, T1 two, T three);
    void SoAmI<T1, T2, T3>(T2 one, T1 two, T3 three);
}

对我来说,解决方法是使用GetMethods(...).Select()并比较方法名称,参数计数,类型和类型参数count来找到正确的方法(基本上是方法签名的一部分)。

答案 2 :(得分:0)

使用MethodBase.GetMethodFromHandle中指出的this related answer

var ty = typeof(IAmGeneric<>);
var numTyParams = ty.GenericTypeArguments.Length;
var mi = ... do something with ty to get generic def for SoAmI<> ...
var parameters = new[] { typeof(int), typeof(string) };
var output = MethodBase.GetMethodFromHandle(mi.MethodHandle, ty.MakeGenericType(parameters.Take(numTyParams).ToArray()).TypeHandle).MakeGenericMethod(parameters.Skip(numTyParams).ToArray());