簡體   English   中英

如何在C#中獲取屬性的所有者類

[英]How to get owner class of property in C#

我需要分析我的對象並在列表中顯示它的一些屬性。 我的對象具有一些屬性,這些屬性來自基類“ ObjectBaseClass”,這些屬性不應顯示在列表中。

我怎么知道,一個物業是否來自基層?

即我有一個IDisposableExtended接口,該接口將在我的對象類中實現。 但是在我的列表中,我不想顯示這兩個屬性“ Disposable”和“ Disposed”。 我該如何過濾它們?

public interface IDisposableExtended : IDisposable
{
    bool Disposable { get; }
    bool Disposed { get; }
}

非常感謝!

ps屬性可以來自基類(級別1),基類(級別1)也可以具有來自其自己的基類(級別2)的某些屬性。 是這樣的,當我使用包含BindingFlags.DeclaredOnly的GetProperties(flags)時,來自基類(級別1和級別2)的所有屬性都將被過濾? 我可以過濾基類1或2級嗎? 這意味着,我想先獲取所有屬性,然后根據其基類手動進行過濾。 然后,我可以控制它們以顯示我需要的屬性。

首先,這些屬性的“所有者”實際上是類,而不是接口。 該接口可以訪問那些屬性,但是這些屬性的聲明類型仍然是該類。

但是,當您通過反射發現屬性時,繼承的屬性將具有不同的聲明類型 這是一個LINQPad程序,它演示:

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以將搜索限制為未繼承的成員。

在此處閱讀更多信息: http : //msdn.microsoft.com/zh-cn/library/kz0a8sxy(v=vs.110).aspx

回應評論(即使我不確定我是否理解正確)。 這是一個快速程序,它將遍歷類型層次結構並顯示在類型本身上聲明的屬性,但不包括每個級別的繼承屬性。

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”僅返回在類上聲明的屬性。 希望這有助於實現您的期望。

注意: Type.BaseType對於object類型將為null,因為它是根類型。 如果您希望循環停止在其他任何類型,則應該可以說while (t != TypeYouWantToStopAt.GetType())

這與您的問題略有出入,但可能會給您一個解決所描述問題的不同方法的想法。

您可以聲明一個自定義屬性,用於標記不想列出的任何屬性(或實際上是任何成員)。 枚舉對象的屬性時,可以檢查其屬性並跳過已標記的任何內容。 這類似於.NET屬性編輯器控件的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM