Распечатайте имя метода производного класса, вызвав метод базового класса - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть следующий класс в 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
    }
}

Так что я ищу?

Ответы [ 2 ]

6 голосов
/ 06 апреля 2011

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

  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 голос
/ 06 апреля 2011

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

...