Как получить правильный объект MethodInfo, когда класс использует обобщенные и универсальные параметры типа - PullRequest
8 голосов
/ 29 декабря 2010

Мне было интересно, сможет ли кто-нибудь продемонстрировать, как использовать метод Type GetMethod () для получения объекта MethodInfo для следующей подписи:

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

Спасибо,

Xam

Ответы [ 2 ]

7 голосов
/ 29 декабря 2010
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
    ) { }
}
0 голосов
/ 29 декабря 2010
Type[] types = new Type[]{typeof(ClassUsedForTypeArgument)};
var info = typeof(Class).getMethod("StaticMethod").MakeGenericMethod(types);

"info" содержит то, что вы хотите, если я не ошибаюсь.

Редактировать: Если вам просто нужна общая информация о методе, без ее создания с аргументом типа, вы можете сделатьследующий.

var info = typeof(Class).getMethod("StaticMethod");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...