[英]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.