Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中获取属性的所有者类#_C#_Properties_Base Class_Owner - Fatal编程技术网

C# 如何在C中获取属性的所有者类#

C# 如何在C中获取属性的所有者类#,c#,properties,base-class,owner,C#,Properties,Base Class,Owner,我需要分析我的对象,并在列表中显示它的一些属性。 我的对象有一些属性,它们来自基类“ObjectBaseClass”,这些属性不应该显示在我的列表中 我怎么知道属性是否来自基类 i、 如果我有一个IDisposableExtended接口,这个接口将在我的对象类中实现。但在我的列表中,我不想显示这两个属性“一次性”和“处置”。我如何过滤它们 public interface IDisposableExtended : IDisposable { bool Disposable { get

我需要分析我的对象,并在列表中显示它的一些属性。 我的对象有一些属性,它们来自基类“ObjectBaseClass”,这些属性不应该显示在我的列表中

我怎么知道属性是否来自基类

i、 如果我有一个IDisposableExtended接口,这个接口将在我的对象类中实现。但在我的列表中,我不想显示这两个属性“一次性”和“处置”。我如何过滤它们

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?这意味着,我希望首先获取所有属性,然后手动根据它们的基类进行过滤。然后我可以控制它们来显示我需要的属性。谢谢你的回答。我也想过。但是这样做太贵了;-)