我在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
}
}
那我在找什么?
答案 0 :(得分:6)
这里有一些问题:
MethodA
,MethodB
和MethodC
是方法,而不是属性,因此您需要使用GetMethods
代替GetProperties
。GetType
)而不是基类类型(typeof(BaseAbstract)
)。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 :(得分:1)
将typeof(BaseAbstract).GetProperties()
替换为this.GetType().GetProperties()
。