想象一下,你有abstract base class A
,并且
abstract class B
继承自A
A 命名的 + 覆盖方法foo()
另外,你有concrete class C
which 继承自B
C
foo
继承了被覆盖的方法。
现在考虑method foo
使用反射并迭代所有类属性。
问题是:什么时候C.foo()
吃午饭,反射是在C Class
属性上还是在B class
属性上进行?
我需要它只在级别的属性上完成C
。
想象一下,你有abstract base class A
,并且
abstract class B
继承自A
A 命名的 + 覆盖方法foo()
另外,你有concrete class C
which 继承自B
C
foo
继承了被覆盖的方法。
现在考虑method foo
使用反射并迭代所有类属性。
问题是:什么时候C.foo()
吃午饭,反射是在C Class
属性上还是在B class
属性上进行?
我需要它只在级别的属性上完成C
。
见BindingFlags.DeclaredOnly
:
public override void Foo() {
PropertyInfo[] piAry = GetType().GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly);
}
让我们假设您的A类看起来与此类似。
abstract class A
{
public string PropertyA { get; set; }
public abstract List<PropertyInfo> Foo();
}
现在,如果您的B类继承自此类,并重写Foo()方法,那么它可能类似于以下定义。
abstract class B : A
{
public string PropertyB { get; set; }
public override List<PropertyInfo> Foo()
{
return GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.ToList();
}
}
此外,您的最后一个类,即C,它是唯一的具体类,然后将简单地定义如下。
class C : B
{
public string PropertyC { get; set; }
}
为了测试此解决方案,并查看唯一返回的属性是PropertyC,您需要运行以下代码行。
class Program
{
static void Main()
{
new C().Foo().ForEach(x => Console.WriteLine(x.Name));
Console.Read();
}
}