Вывод имени метода производного класса путем вызова метода базового класса

#c# #reflection #inheritance #abstract-class

#c# #отражение #наследование #абстрактный класс

Вопрос:

У меня есть следующий класс в c #, должно быть легко выполнить

 public abstract class BaseAbstract
{
    public void PrintMethodNames()
    {   // This line might needs change
        foreach (PropertyInfo pi in typeof(BaseAbstract).GetProperties())
        {
            Console.WriteLine(pi.Name);
        }
    }
}

public class DerivedClass : BaseAbstract
{
    public void MethodA() { }
    public void MethodB() { }
    public void MethodC() { }
}

public class MainClass
{
    public static void Main()
    {
        BaseAbstract ba = new DerivedClass();
        ba.PrintMethodNames();
        // desired printout 
        // MethodA
        // MethodB
        // MethodC
        // but obviously not working
    }
}
  

Итак, что я ищу?

Ответ №1:

Здесь есть несколько проблем:

  1. MethodA , MethodB и MethodC являются методами, а не свойствами, поэтому вам нужно использовать GetMethods вместо GetProperties .
  2. Вы должны использовать текущий тип экземпляра ( GetType ) вместо типа базового класса ( typeof(BaseAbstract) ).
  3. Вам нужно ограничить отражение с помощью BindingFlags , чтобы получить только методы, определенные в производном классе. В противном случае, без этих флагов, вы получите все методы, определенные для данного типа (например, ToString , GetHashCode и даже PrintMethodNames ).

Это выводит то, что вы ожидаете:

 public abstract class BaseAbstract
{
    public void PrintMethodNames()
    {
        BindingFlags flags =
            BindingFlags.DeclaredOnly |
            BindingFlags.Public |
            BindingFlags.Instance |
            BindingFlags.Static;

        foreach (MethodInfo mi in GetType().GetMethods(flags))
        {
            Console.WriteLine(mi.Name);
        }
    }
}
  

Комментарии:

1. Дело в том, что он хочет перечислить все методы DerivedCalss из BaseClass (напротив). Базовый класс не знает, что это производный класс, и в этом проблема.

2. @HABJAN: код, который я предоставил, делает это. Если вы замените его BaseAbstract на мою версию выше и запустите программу, вы увидите, что она выводит желаемый результат (только методы, определенные в DerivedClass ).

3. @HABJAN: Смотрите пункт № 2: GetType возвращает тип времени выполнения экземпляра, а не статический тип, в котором GetType вызывается. Итак, в данном конкретном случае GetType возвращается DerivedClass .

Ответ №2:

Замените typeof(BaseAbstract).GetProperties() на this.GetType().GetProperties() .

Комментарии:

1. спасибо за быстрый ответ, но я собираюсь отдать должное Крису Шмичу за добавление кода BindingFlag