C# 如何在C中获取属性的所有者类#
我需要分析我的对象,并在列表中显示它的一些属性。 我的对象有一些属性,它们来自基类“ObjectBaseClass”,这些属性不应该显示在我的列表中 我怎么知道属性是否来自基类 i、 如果我有一个IDisposableExtended接口,这个接口将在我的对象类中实现。但在我的列表中,我不想显示这两个属性“一次性”和“处置”。我如何过滤它们C# 如何在C中获取属性的所有者类#,c#,properties,base-class,owner,C#,Properties,Base Class,Owner,我需要分析我的对象,并在列表中显示它的一些属性。 我的对象有一些属性,它们来自基类“ObjectBaseClass”,这些属性不应该显示在我的列表中 我怎么知道属性是否来自基类 i、 如果我有一个IDisposableExtended接口,这个接口将在我的对象类中实现。但在我的列表中,我不想显示这两个属性“一次性”和“处置”。我如何过滤它们 public interface IDisposableExtended : IDisposable { bool Disposable { get
public interface IDisposableExtended : IDisposable
{
bool Disposable { get; }
bool Disposed { get; }
}
非常感谢
p、 s属性可以来自基类(级别1),基类(级别1)也可以有来自自己基类(级别2)的一些属性。是这样吗,当我使用包含BindingFlags.DeclaredOnly的GetProperties(flags)时,所有来自基类(级别1和级别2)的属性都将被过滤掉?我可以只过滤基类级别1或级别2吗? 这意味着,我希望首先获取所有属性,然后手动根据它们的基类进行过滤。然后我可以控制它们来显示我需要的属性。首先,这些属性的“所有者”实际上是类,而不是接口。接口允许访问这些属性,但这些属性的声明类型仍然是类 但是,当您通过反射发现继承的属性时,它们将具有不同的声明类型。下面是一个演示以下内容的程序:
void Main()
{
var derivedType = typeof(Derived);
derivedType.GetProperties().Dump("All");
derivedType.GetProperties(BindingFlags.DeclaredOnly
| BindingFlags.Public | BindingFlags.Instance).Dump("Declared only");
}
public class Base
{
public string BaseProperty { get; set; }
}
public class Derived : Base
{
public string DerivedProperty { get; set; }
}
请注意,如果您还在
Derived
中实现接口,则在转储Derived
的属性时也会显示这些方法/属性,因为它们是按该类型声明的。是的,它们用于实现接口,但它们也被类型声明为“所有”。您应该使用type.GetProperty(String,BindingFlags)
方法重载,并包括BindingFlags.DeclaredOnly
将搜索限制为未继承的成员
请在此处阅读更多信息:
作为对评论的回应(尽管我不确定自己是否理解正确)。下面是一个快速程序,它将遍历类型层次结构并显示在类型本身上声明的属性,不包括每个级别上的继承属性
namespace ConsoleApplication1
{
class ClassA
{
public string ClassAProp { get; set; }
}
class ClassB : ClassA
{
public string ClassBProp { get; set; }
}
class ClassC : ClassB
{
public string ClassCProp { get; set; }
}
class Program
{
static void Main(string[] args)
{
var c = new ClassC();
var t = c.GetType();
while (t.BaseType != null)
{
var cProps = t.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
foreach (var p in cProps)
{
Console.WriteLine("{0} defines {1}", t.Name, p.Name);
}
t = t.BaseType;
}
Console.ReadLine();
}
}
}
因此,您可以看到“BindingFlags.DeclaredOnly”只返回类上声明的属性。希望这有助于实现你的目标
注意:
类型。对于对象
类型,BaseType将为null,因为它是根类型。如果您希望循环在任何其他类型停止,您应该能够说,而(t!=TypeYouWantToStopAt.GetType())
这与您的问题稍有出入,但可能会给您提供一个解决所描述问题的不同方法的想法
您可以声明一个自定义属性,用于标记不想列出的任何属性(或任何成员)。枚举对象的属性时,可以检查对象的属性并跳过已标记的任何内容。这与.NET属性编辑器控件的工作方式类似。属性可以来自基类(级别1),基类(级别1)也可以具有来自其自己的基类(级别2)的一些属性。是不是当我使用包含BindingFlags.DeclaredOnly的GetProperties(flags)时,所有来自基类(级别1和级别2)的属性都将被过滤?这是否可能,我只是过滤基类级别1或级别2?这意味着,我希望首先获取所有属性,然后手动根据它们的基类进行过滤。然后我可以控制它们来显示我需要的属性。属性可以来自基类(级别1),基类(级别1)也可以有来自自己基类(级别2)的一些属性。是不是当我使用包含BindingFlags.DeclaredOnly的GetProperties(flags)时,所有来自基类(级别1和级别2)的属性都将被过滤?这是否可能,我只是过滤基类级别1或级别2?这意味着,我希望首先获取所有属性,然后手动根据它们的基类进行过滤。然后我可以控制它们来显示我需要的属性。谢谢你的回答。我也想过。但是这样做太贵了;-)