当类使用泛型和泛型类型参数时,如何获取正确的MethodInfo对象

时间:2010-12-29 04:42:41

标签: c# generics reflection

我想知道是否有人可以演示如何使用Type的GetMethod()方法为以下签名检索MethodInfo对象:

Class.StaticMethod<T>(T arg1, IInterface1 arg2, IEnumerable<IInterface2> arg3)

谢谢,

XAM

2 个答案:

答案 0 :(得分:7)

MethodInfo methodInfo = typeof(Class)
                            .GetMethods(
                                BindingFlags.Public | BindingFlags.Static
                            )
                            .Where(m => m.Name == "StaticMethod")
                            .Where(m => m.IsGenericMethod)
                            .Where(m => m.GetGenericArguments().Length == 1)
                            .Where(m => m.GetParameters().Length == 3)
                            .Where(m =>
                                m.GetParameters()[0].ParameterType == 
                                    m.GetGenericArguments()[0] &&
                                m.GetParameters()[1].ParameterType == 
                                    typeof(IInterface1) &&
                                m.GetParameters()[2].ParameterType == 
                                    typeof(IEnumerable<IInterface2>)
                            )
                            .Single();

请注意,您必须按照

进行操作
methodInfo = methodInfo.MakeGenericMethod(new Type[] { typeof(ConcreteType) });

关闭ConcreteType类型参数T所需类型的类型。

我假设:

class Class {
    public static void StaticMethod<T>(
        T arg1,
        IInterface1 arg2,
        IEnumerable<IInterface2> arg3
    ) { }
}

答案 1 :(得分:0)

Type[] types = new Type[]{typeof(ClassUsedForTypeArgument)};
var info = typeof(Class).getMethod("StaticMethod").MakeGenericMethod(types);
如果我没有弄错的话,

“info”包含你想要的东西。

编辑:如果您只想要通用方法信息,而不使用type参数进行实例化,则可以执行以下操作。

var info = typeof(Class).getMethod("StaticMethod");