2010-01-25 24 views
14

我有一個表示接口的System.Type實例,我想獲得該接口上所有屬性的列表 - 包括那些從基接口繼承的屬性。我基本上需要從我爲類獲得的接口獲得相同的行爲。反映一個接口的所有屬性,包括繼承的屬性?

例如,鑑於這一層次:

public interface IBase { 
    public string BaseProperty { get; } 
} 
public interface ISub : IBase { 
    public string SubProperty { get; } 
} 
public class Base : IBase { 
    public string BaseProperty { get { return "Base"; } } 
} 
public class Sub : Base, ISub { 
    public string SubProperty { get { return "Sub"; } } 
} 

如果我呼籲類的GetProperties - typeof(Sub).GetProperties() - 然後我得到兩個BaseProperty和子屬性。我想用界面做同樣的事情,但是當我嘗試它時 - typeof(ISub).GetProperties() - 所有返回的都是SubProperty。

我嘗試將BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy傳遞給GetProperties,因爲我對FlattenHierarchy的理解是它應該包含來自基類的成員,但行爲完全相同。

我想我可以遍歷Type.GetInterfaces(),並呼籲每個人的GetProperties,但後來我將依賴於GetProperties中的接口上從未迴歸基本屬性(因爲如果做過,我會得到副本)。如果沒有至少看到它的記錄,我寧願不依賴這種行爲。

如何,我不是:

  • 獲取一個接口上的所有屬性的列表,包括那些從基接口?或
  • 至少有信心,我所看到的是可以依賴的記錄行爲,所以我可以解決它嗎?
+1

[GetProperties()返回接口繼承層次結構的所有屬性的可能的重複](http://stackoverflow.com/questions/358835/getproperties-to-return-all-properties-for-an-interface-inheritance - 層次結構) – nawfal 2013-04-29 14:17:43

回答

7

各種各樣的答案是(即讓所有的實現接口。)在註釋發現the .NET framework version 3.5-specific MSDN page on GetProperties(BindingFlags bindingFlags)

傳遞BindingFlags.FlattenHierarchy 到典型值之一e.GetXXX方法, 如Type.GetMembers,將不會 返回繼承的接口成員 當您查詢接口 類型本身。

[...]

要得到繼承的成員,你需要 查詢每個實現的接口 爲它的成員。

示例代碼也包括在內。這個評論是由微軟發佈的,所以我會說你可以信任它。

+0

您提到的「社區添加」未顯示該頁面的當前版本 - 您必須返回到.Net Framework 3.5版本。這是一個直接鏈接:http://msdn.microsoft.com/en-us/library/kyaxdd3x%28v=vs。90%29.aspx – RenniePet 2014-07-25 09:42:42

+0

@RenniePet謝謝,更新 – AakashM 2014-07-25 09:55:32