通过调用基类的方法打印派生类的方法名称

时间:2011-04-05 21:38:52

标签: c# reflection inheritance abstract-class

我在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 个答案:

答案 0 :(得分:6)

这里有一些问题:

  1. MethodAMethodBMethodC是方法,而不是属性,因此您需要使用GetMethods代替GetProperties
  2. 您应该使用当前实例类型(GetType)而不是基类类型(typeof(BaseAbstract))。
  3. 您需要使用BindingFlags约束反射,以便只获取派生类上定义的方法。否则,如果没有这些标志,您将获得在该类型上定义的所有方法(如ToStringGetHashCode,甚至PrintMethodNames)。
  4. 打印出您期望的内容:

    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 :(得分:1)

typeof(BaseAbstract).GetProperties()替换为this.GetType().GetProperties()