Подтвердить что ты не робот

Отражение: как получить общий метод?

Возможные дубликаты:
Как использовать отражение для вызова общего метода?
Выбрать правильный общий метод с отражением

Привет, там

Скажем, у меня есть два следующих двух метода в классе:

public void MyMethod(object val) {}
public void MyMethod<T>(T val) {}

С отражением я мог бы получить первый метод следующим образом:

Type[] typeArray = new Type[1];
typeArray.SetValue(typeof(object), 1);
var myMethod = myInstance.GetType().GetMethod("MyMethod", typeArray);

Но как я могу получить второй, общий метод?

4b9b3361

Ответ 1

var myMethod = myInstance.GetType()
                         .GetMethods()
                         .Where(m => m.Name == "MyMethod")
                         .Select(m => new {
                                              Method = m,
                                              Params = m.GetParameters(),
                                              Args = m.GetGenericArguments()
                                          })
                         .Where(x => x.Params.Length == 1
                                     && x.Args.Length == 1
                                     && x.Params[0].ParameterType == x.Args[0])
                         .Select(x => x.Method)
                         .First();

Ответ 2

Я бы сделал это следующим образом:

var methods = from m in typeof(MyClass).GetMethods()
              where m.Name == "MyMethod"
                 && m.IsGenericMethodDefinition

              let typeParams = m.GetGenericArguments()
              let normalParams = m.GetParameters()

              where typeParams.Length == 1 && normalParams.Length == 1
                 && typeParams.Single() == normalParams.Single().ParameterType
                 && !typeParams.Single().GetGenericParameterConstraints().Any()

              select m;

var myMethod = methods.Single();

Мы ищем метод под названием "MyMethod", который является общим методом с единственным параметром типа без ограничений и одним "нормальным" параметром того же типа, что и параметр типа.

Очевидно, что если вы не хотите быть очень точным, вы можете просто сделать минимальный минимум для устранения неоднозначности, например:

var myMethod = typeof(MyClass)
              .GetMethods()
              .Single(m => m.Name == "MyMethod" && m.IsGenericMethodDefinition);