Проверка наличия у метода определенной сигнатуры с помощью 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())