2009-09-21 2 views
2

Мое намерение состоит в исследовании? „Методы“ типа с использованием отражения для того, чтобы проверить следующее:C# - Исследование «Информация о методе» с помощью отражения

  1. Методы должны быть методы экземпляра и общественности.

  2. принимает параметр "Params" и пустоты в природе.

  3. Метод не делает рекурсивный вызов.

Я начал как:

static void ProcessMethodInfo(Type t) 
    { 
     MethodInfo[] info = t.GetMethods(); 

     foreach (MethodInfo mi in info) 
     { 

      // How to check the conditions here ? 

     } 
    } 

Но я не знаю, как поступить дальше. Помощь нужна.

+0

Я думаю, что элемент 3 будет чрезвычайно сложно правильно проверить. Для ваших целей метод рекурсивный, если он является взаимно-рекурсивным с другим методом (т. Е. Метод a вызывает b, который вызывает a)? – jason

+0

Спасибо. Я тестирую метод рекурсивно сам по себе не взаимный. Например, ряд фибоначчи. – user160677

+0

@csharpbaby: Даже это будет очень сложно и не справиться с отражением. – jason

ответ

3

Ну, если на 3 вы имеете в виду метод подлежит проверке не должен быть рекурсивным; то это боль - вам нужно будет разобрать IL. Но для других;

Type type = ... 
    var qry = from method in type.GetMethods(
        BindingFlags.Instance | BindingFlags.Public) 
       where method.ReturnType == typeof(void) 
       let parameters = method.GetParameters() 
       where parameters.Length == 1 
       && parameters[0].ParameterType.IsArray 
       && Attribute.IsDefined(parameters[0], typeof(ParamArrayAttribute)) 
       select method; 
    foreach (var method in qry) 
    { 
     Console.WriteLine(method.Name); 
    } 
+2

Я думаю, что использование == для сравнения экземпляров классов следует избегать. Равные значения могут быть переопределены, но == обычно не перегружены. – Joren

+1

Вы имеете в виду «Тип»? Это совершенно верно. Я знаю, что вы говорите, но код в порядке. –

+0

Отлично Marc.Thank вас очень много. – user160677

0

Не думаю, что вы сможете обнаружить элемент 3, используя отражение.

0

Проверьте следующие члены класса MethodInfo:

  • IsPublic
  • IsStatic
  • ReturnType
  • GetParameters() метод

Для того, чтобы иметь возможность проверить, является ли метод является рекурсивным, я думаю, что вам нужно что-то больше, чем просто простое отражение ,