Проверка наличия у метода определенной сигнатуры с помощью Reflection

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

static ConversionMerit NAME(TYPE1, out TYPE2, out string)

Там, где меня не волнуют имена или типы первых двух параметров, но второй и третий параметры должны быть параметрами out, а третий должен иметь тип System.String.

Моя проблема с окончательной проверкой на строгость:

MethodInfo[] methods = GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
  foreach (MethodInfo method in methods)
  {
    if (method.ReturnType != typeof(ConversionMerit))
      continue;

    ParameterInfo[] parameters = method.GetParameters();
    if (parameters.Length != 3)
      continue;

    if (parameters[0].IsOut) continue;
    if (!parameters[1].IsOut) continue;
    if (!parameters[2].IsOut) continue;

    // Validate the third parameter is of type string.
    Type type3 = parameters[2].ParameterType;
    if (type3 != typeof(string))   // <-- type3 looks like System.String&
      continue;

    // This is where I do something irrelevant to this discussion.
  }

Свойство ParameterType третьего ParameterInfo говорит мне, что типом является System.String&, и сравнивать его с typeof(string) не удается. Каков наилучший способ выполнить эту проверку? Это звучит немного странно, чтобы сравнить имя типа с помощью сравнения строк.

2 ответа

Решение

Вам нужно использовать MakeByRefType метод, чтобы получить тип string& Затем просто сравните его с данным типом.

 if (type3 != typeof(string).MakeByRefType())   

System.String& возвращается, если ваш параметр метода передан ref или является выходным параметром. Когда строка передается нормально, она будет отображаться как System.String, которая будет соответствовать вашему условию if

if (type3 != typeof(string)) 

Для того, чтобы сравнить типы ссылок, вы можете сделать это

if (type3 != typeof(string).MakeByRefType()) 
Другие вопросы по тегам