Как проверить, существует ли действительный метод, когда задействованы параметры - PullRequest
3 голосов
/ 18 августа 2011

У меня есть следующий метод:

    public MethodInfo FancyGetMethodInfo
         (object obj, string methodName, Type[] methodSignature)
    {
        return obj.GetType().GetMethod(methodName, methodSignature);
    }

и ради примера, который я имею в своем объекте, я передаю два метода

    public int Subtract(int a, int b) { return a - b; }

    public int Add(params int[] a) { return a.Sum(); }

И когда я выполняюследующие строки я получаю эти результаты:

        var SubMethod = FancyGetMethodInfo(obj, "Subtract", 
                         new Type[] { typeof(int), typeof(int) });
        //I get a MethodInfo
        var AddMethod = FancyGetMethodInfo(obj, "Add", 
                         new Type[] { typeof(int), typeof(int) }); 
        //I get a Null reference

Я уверен, что это из-за параметров в Add.Есть ли чистый способ получить ссылку на мое MethodInfo для моего метода Add с заданным типом Type [] произвольного размера, содержащим целочисленные значения и имеющего доступ только к предоставленным переменным в моем методе FancyGetMethodInfo?

Редактировать: более красноречиво изложенный Джоном Скитом, я хочу выполнить ту же привязку, что и компилятор C # в моем методе.он должен работать должным образом с подклассами, неявным приведением, параметрами произвольной длины и т. д. ...

Также в соответствии с запросом, соответствующая ссылка здесь: Определение, использует ли параметр "params", используя отражение в C #? что даст мне понять, что метод имеет params.

Ответы [ 4 ]

1 голос
/ 18 августа 2011

Ну, вы могли бы:

  • Найдите все методы с правильным именем
  • Для каждого метода:
    • Проверьте, является ли последний параметр в методе массивом "params" (согласно этот вопрос ; спасибо yas4891)
    • Проверьте, соответствуют ли типы параметров, которые вам были заданы, до, но не включая последний параметр, совпадающий с указанным в методе
    • Проверьте, все ли остальные типы параметров соответствуют типу элементов массива конечного параметра

Обратите внимание, что как только вы нашли совпадение (а не нашло совпадение, которое не требует расширения параметров), вам нужно будет запомнить , чтобы вы может иметь дело с аргументами позже (при условии, что вы действительно хотите вызвать метод).

Это немного ошибочно, если честно ... с моей точки зрения, у вас есть три варианта:

  • Измените вызывающего абонента на typeof(int[]), и ваш существующий код будет работать
  • Измените FancyGetMethodInfo для обработки массивов параметров, как описано выше
  • Изменить Sum, чтобы принимать два целых числа (или, возможно, иметь различные перегрузки)

Вам решать, какой маршрут вы выберете ...

0 голосов
/ 18 августа 2011
Параметр

A params является не более чем синтаксическим сахаром для простого массива.

    int Add(params int[] a)

эквивалентен с точки зрения CLR

    int Add(int[] a)

the params модификатор - это просто синтаксический сахар C #.

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

var AddMethod = FancyGetMethodInfo(obj, "Add", 
                         new Type[] { typeof(int[]) }); 

, если вы хотите продолжитьчтобы проверить, содержит ли метод параметр params, необходимо проверить, имеет ли он ParamArrayAttribute , примененный к последнему параметру метода.

0 голосов
/ 18 августа 2011

Это не из-за параметров (хотя это может представлять дополнительную проблему).

Попробуйте вместо этого: var AddMethod = FancyGetMethodInfo (obj, "Add", new Type [] {typeof (int [])});

0 голосов
/ 18 августа 2011

Вы попробовали:

Из MSDN: Type.GetMethod

public void MethodA(int[] i) { }

// Get MethodA(int[] i)
mInfo = typeof(Program).GetMethod("MethodA",
    BindingFlags.Public | BindingFlags.Instance,
    null,
    new Type[] { typeof(int[]) },
    null);
Console.WriteLine("Found method: {0}", mInfo);

Как проверить ключевое слово "params": на этот вопрос ответили здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...