想象一下你有abstract base class A
,还有 继承自 A
+ 重写 A 命名foo()
方法的abstract class B
此外,您还有从B
继承的concrete class C
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();
}
}