Как узнать, не был ли метод унаследован от базовых классов C #

Учитывая этот фрагмент кода, как я могу узнать, используя переменную «i», что метод не был получен из базовых классов, но был объявлен в классе с наиболее низкими характеристиками? Например, мне не нужны методы GetType (), ToString () и т. Д. Для печати.

MethodInfo[] methods = Type.GetType(
            "Probabilities_Theory.ProbabilitiesTheory").GetMethods();

foreach (var i in methods)
{
    if (!i.IsVirtual) // another condition needed
        Console.WriteLine(i);
}

Мне не нужно знать, было ли это переопределено, потому что, например, метод GetType () не является виртуальным по этой причине. Но я все еще не хочу, чтобы напечатали GetType ().

Что общего в GetType () и других виртуальных методах, так это то, что все они не были объявлены в самом низком классе.

Я мог сделать это так:

if (i.DeclaringType == typeof(ProbabilitiesTheory))
    Console.WriteLine(i);

Но я хочу, чтобы мой код был более автоматическим, более программным и так далее. Как будто не знаешь, что это за тип.


person Марк Павлович    schedule 25.11.2018    source источник
comment
Это похоже на проблему XY мета. stackexchange.com/questions/66377/what-is-the-xy-problem Но для меня любое использование Reflection подходит. Обычно вы просто понимаете это, понижая тип. Тогда вы знаете.   -  person Christopher    schedule 25.11.2018
comment
Проверьте свойства MethodInfo. Должен быть один, говорящий, какой тип объявил этот метод.   -  person    schedule 25.11.2018
comment
Возможный дубликат Определить, был ли метод переопределен с помощью Reflection (C #)   -  person Alexander Pope    schedule 25.11.2018


Ответы (1)


Попробуйте с BindingFlags.DeclaredOnly:

MethodInfo[] methods = Type.GetType("Probabilities_Theory.ProbabilitiesTheory")
                           .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
person Pragmateek    schedule 25.11.2018
comment
Почему-то не получилось. Я получил массив из 0 элементов в результате выполнения этого - person Марк Павлович; 25.11.2018
comment
Если вы указываете bindingFlags, вы должны указать все, что имеет отношение к делу, поэтому BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public) - person Klaus Gütter; 25.11.2018
comment
@ KlausGütter Вы правы, я упустил этот момент, спасибо за исправление. :) - person Pragmateek; 25.11.2018