2013-08-24 194 views
2

我廣泛使用foovar.GetType().GetProperty("PropertyName").GetValue(foovar)通過反射來獲取變量變量的屬性值。但它似乎不適用於接口類型。通過反射獲取接口屬性

IFoo foo = GetFoo(); 
string fooName= foo.Name; //It works perfectly 

我正在使用第三方程序集,因此我無權訪問該實現。有一個'名稱'屬性,我可以得到這個值。但不能通過反思。

當我嘗試string s = (string)foo.GetType().GetProperty("Name").GetValue(foo);我得到一個空的錯誤:有

我已經檢查PropertyInfo[] pi = foo.GetType().GetProperties();無「名」屬性,我可以看到約200性能,這些都不是「名」。事實上,許多其他「智能感知屬性」都沒有出現。

¿如何檢索接口類型屬性的值?

謝謝!

+0

爲什麼你需要這個反射?你有沒有試圖用ILSpy,dotPeek或Reflector來觀察實驗? –

+0

我有類型至極我需要在運行時訪問的屬性。它有很多不同類型的。我通過數據庫或XML獲取每次需要使用的屬性名稱和屬性類型,然後使用反射和泛型來獲取值。 – Kaikus

回答

2

返回的對象明確可以實現IFoo,所以Name屬性將是私有的。 可以使用接口類型來代替:

object property = typeof(IFoo).GetProperty("Name").GetValue(foo); 

編輯:如果不工作的話,我只能假設屬性是一些其它接口上IFoo工具例如實際上定義

public interface IBase 
{ 
    string Name { get; } 
} 

public interface IFoo : IBase 
{ 
} 

在這種情況下,你需要找到實際的接口,聲明Name並使用它。

+0

對不起,它不斷給我錯誤。事實上,當我嘗試'typeof(IFoo).GetProperties()'我有和當我嘗試'foo.GetType()相同的屬性。Getproperties()' – Kaikus

+0

@Kaikus - 我已經更新了答案 - 這樣做幫幫我? – Lee

+0

謝謝!遵循你的想法,在編輯器中,通過'intellisense',我發現IFoo中的propery被定義爲'string IBase.Name'。所以解決方案是'string(string)typeof(IBase).GetProperty(「Name」)。GetValue(foo);'即使'foo'被定義爲IFoo。 :)順便說一句,你知道任何方式來查詢接口關於它的實現,所以我可以通過代碼得到這個(名稱實際上是IBase.Name)? – Kaikus