Есть ли хороший способ получить MethodInfo открытого универсального метода? - PullRequest
3 голосов
/ 12 января 2009

Рассмотрим тип как этот

public interface IHaveGenericMethod
{
   T1 Method<T1>(T1 parm);
   T2 Method<T1,T2>(T1 parm);
   int Method2(int parm);
}

Как мне получить methodInfo для его методов? для обычного неуниверсального метода, такого как method2, я могу пойти с

typeof(IHaveGenericMethod).GetMethod("methodName",new Type[]{typeof(itsParameters)});

для универсального метода, хотя я не могу, так как его параметры не являются типами как таковыми. Итак, как мне это сделать? Я знаю, что могу позвонить

typeof(IHaveGenericMethod).GetMethods()

чтобы получить все методы этого типа, а затем выполнить итерацию по этой коллекции и выполнить некоторое сопоставление, но это ужасно Есть ли лучший способ?

Ответы [ 3 ]

2 голосов
/ 13 января 2009

Обязательно проверьте страницу MSDN " Отражение и общие типы ".

, поскольку его параметры не являются типами как таковыми

На самом деле, я думаю, это потому, что вы хотите запросить тип параметров, но список типов, который вы можете предоставить GetMethod(), не предназначен для параметров типа.

Кроме того, помните, что все, что вам нужно для выбора «группы методов» универсальных методов, это знать количество параметров универсального типа. Так что вы можете просто посчитать их.

затем итерация

Не повторять, запрос:

       var mi = from mi in typeof(IHaveGenericMethod).GetMethods()
                where mi.Name == "Method"
                where mi.IsGenericMethodDefinition
                where mi.GetGenericArguments().Length == 2
                select mi;
1 голос
/ 12 января 2009

Ну, они типы - сорта:

    foreach (var method in typeof(IHaveGenericMethod).GetMethods())
    {
        Console.WriteLine(method.Name);
        if (method.IsGenericMethodDefinition)
        {
            foreach (Type type in method.GetGenericArguments())
            {
                Console.WriteLine("> " + type.Name);
            }
        }
    }

Таким образом, вы можете проверить количество аргументов и проверить подпись. Но ничего чище.

0 голосов
/ 20 мая 2019

Лично я делаю следующее:

public static MethodInfo ExtractMethodInfo<TDeclaringType, TMethod>(Expression<Func<TDeclaringType, TMethod>> methodAccessExpression) {
    return (MethodInfo)((ConstantExpression)((MethodCallExpression)((UnaryExpression)methodAccessExpression.Body).Operand).Object).Value;
}

var genericQueryMethodInfo = ExpressionHelper.ExtractMethodInfo<DbContext, Func<IQueryable<object>>>(context => context.Query<object>).GetGenericMethodDefinition();

Таким образом, вы обязательно найдете правильный, и я думаю, что это лучше, чем перебирать все methodInfos.

...