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

Xam*_*Xam 8 c# generics reflection

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

Class.StaticMethod<T>(T arg1, IInterface1 arg2, IEnumerable<IInterface2> arg3)
Run Code Online (Sandbox Code Playgroud)

谢谢,

XAM

jas*_*son 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();
Run Code Online (Sandbox Code Playgroud)

请注意,您必须遵循此操作

methodInfo = methodInfo.MakeGenericMethod(new Type[] { typeof(ConcreteType) });
Run Code Online (Sandbox Code Playgroud)

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

我假设:

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