gpt4 book ai didi

c# - 在 C# 中反射(reflect)派生类

转载 作者:太空狗 更新时间:2023-10-29 23:27:14 24 4
gpt4 key购买 nike

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

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

换句话说,我想获得可用的“最顶层”覆盖,否则 - 基本属性。实现目标最干净的方法是什么?目前我只知道检查所有属性并检查名称和声明类型。

最佳答案

基本上,我同意 Martin 的观点: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 将被退回。

关于c# - 在 C# 中反射(reflect)派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2749658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com