2016-06-08 4 views
2

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

var member = type.GetMethod(name, bindingFlags, null, argtypes, null); 

Чтобы получить доступ к методу сопоставления названия и параметры типа, в ядре Dotnet они убрали эту перегрузку, теперь я могу получить только name && binding flags ИЛИ name && parameters type (see) , но не как раньше.

Существует новый метод GetRuntimeMethods, который возвращает IEnumerable<MethodInfo> и включает в себя не общедоступные методы, но я не могу фильтровать по типу параметров.

Существует еще один метод GetRuntimeMethod, который я могу фильтровать по типу параметров, но он не включает в себя не публичные методы.

Я уже пытался что-то вроде этого, но терпит неудачу

var member = type.GetRuntimeMethods().Where(m => 
m.Name == name && (m.GetParameters().Select(p => p.GetType()).ToArray() == argtypes)).FirstOrDefault(); 

Есть ли способ, чтобы получить метод по его имени и параметров типа?

+1

Я не думаю, что можно сравнивать массивы вроде этого:. 'M.GetParameters() Выбрать (р => p.GetType()) .ToArray() == argtypes) '- он не будет сравнивать элементы массива, а ссылки массива, чтобы он всегда был ложным. Вы можете использовать 'Zip' или' SequenceEqual' для сравнения содержимого массивов. – Pawel

ответ

2

Да, эта перегрузка действительно отсутствует. Вы можете использовать GetMethods() и фильтровать выход так, как хотите. Попытка близко, за исключением того, вы не можете сравнивать массивы с помощью ==:

var method = type.GetMethods().FirstOrDefault(m => 
    m.Name == name && m.GetParameters().Select(p => p.ParameterType).SequenceEqual(argTypes)); 
+0

Мой плохой! Работает как шарм, мне просто нужно было изменить p.GetType() на p.ParameterType. Tks – ferodss

 Смежные вопросы

  • Нет связанных вопросов^_^