反映C#中的派生类

pba*_*aga 5 c# reflection properties

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

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

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

mne*_*syn 3

基本上,我同意马丁的观点:BindingFlags.FlattenHierarchy可能就是你所需要的。但是,我认为这些应该用来代替BindingFlags.DeclaredOnly

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

然后,您可以使用c.DeclaringType来查明该属性是在哪个级别声明的。

如果您指定DeclaredOnly并且 Typetype没有声明(而是继承)Pnull将被返回。