我们假设有一个带有虚拟属性的类(我们称之为'P')。它在派生类中被覆盖。现在我想使用这样的东西:
obj.GetType().GetProperty("P")
获取有关覆盖属性的信息。此搜索是不明确的,因为有两个“P”属性(基础和覆盖)。所以我键入了:obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.Instance)
它只返回覆盖的“P”,但是如果在编译时我无法猜测是否有覆盖呢?后一个调用将返回null。如果继承的层次结构更大,情况就更复杂了。
换句话说,我希望获得'最顶层'覆盖,否则 - 基本属性。实现目标的最简洁方法是什么?目前我所知道的只有一个是查看所有属性并检查名称和声明类型。
答案 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?