反映C#中的派生类

时间:2010-05-01 10:59:32

标签: c# reflection properties

我们假设有一个带有虚拟属性的类(我们称之为'P')。它在派生类中被覆盖。现在我想使用这样的东西: obj.GetType().GetProperty("P")获取有关覆盖属性的信息。此搜索是不明确的,因为有两个“P”属性(基础和覆盖)。所以我键入了:obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)

它只返回覆盖的“P”,但是如果在编译时我无法猜测是否有覆盖呢?后一个调用将返回null。如果继承的层次结构更大,情况就更复杂了。

换句话说,我希望获得'最顶层'覆盖,否则 - 基本属性。实现目标的最简洁方法是什么?目前我所知道的只有一个是查看所有属性并检查名称和声明类型。

2 个答案:

答案 0 :(得分:3)

基本上,我同意马丁的观点:BindingFlags.FlattenHierarchy可能就是你所需要的。但是,我认为这些将被用作而不是BindingFlags.DeclaredOnly,即

Type type = obj.GetType();
var c = type.GetProperty("P", BindingFlags.FlattenHierarchy | 
                              BindingFlags.Public | 
                              BindingFlags.Instance);

然后,您可以使用c.DeclaringType找出声明属性的级别。

如果您指定DeclaredOnly且类型type未声明(但继承)P,则会返回null

答案 1 :(得分:1)

您是否尝试添加BindingFlags.FlattenHierarchy