2014-02-10 45 views
1

我想在C#中使用反射的鴨子打字。我有一個隨機類型的對象,我想查找它是否實現了一個具有特定名稱的接口,如果它確實 - 檢索對該接口子對象的引用,以便稍後可以通過該接口讀取(獲取)屬性值。如何在C#中使用反射來檢索對子對象的引用?

實際上我需要as使用反射。

第一部分是容易

var interfaceOfInterest = 
    randomObject.GetType().GetInterface("Full.Interface.Name.Here"); 

這將任一檢索接口描述或空。我們假設它不是null。

所以現在我有一個對象引用一個肯定會實現該接口的對象。

如何使用僅反​​射來獲取子對象的檢索?

回答

2

您不需要,只需通過接口類型訪問接口的屬性,但無論何時需要傳遞實例,只需傳遞原始對象實例即可。

這裏是一個LINQPad程序演示:

void Main() 
{ 
    var c = new C(); 
    // TODO: Check if C implements I 
    var i = typeof(I); 
    var valueProperty = i.GetProperty("Value"); 
    var value = valueProperty.GetValue(c); 
    Debug.WriteLine(value); 
} 

public interface I 
{ 
    string Value { get; } 
} 

public class C : I 
{ 
    string I.Value { get { return "Test"; } } 
} 

輸出:

Test 

如果要訪問它使用的名字更:

void Main() 
{ 
    var c = new C(); 
    // TODO: Check if C implements I 
    var i = c.GetType().GetInterface("I"); 
    if (i != null) 
    { 
     var valueProperty = i.GetProperty("Value"); 
     var value = valueProperty.GetValue(c); 
     Debug.WriteLine(value); 
    } 
} 

public interface I 
{ 
    string Value { get; } 
} 

public class C : I 
{ 
    string I.Value { get { return "Test"; } } 
} 
+0

這出於某種原因沒有按在我的情況下工作 - 我有一個巨大的繼承層次結構,既沒有'動態'綁定也沒有'Get Value()'與對象接口一起工作,所以我需要到達子對象。 – sharptooth

+0

沒有這樣的東西作爲子對象。你能發表一個簡短但完整的例子,詳細說明你遇到的問題嗎?如果你將C投給了我,你可以將它投回來,如果有一個子對象實現了C的子對象,那麼你不能退後一步,GC就會全部失控。所以如果你把C賦給I,那個引用仍然代表C對象。 –

+0

無論如何,我發現問題是因爲我在調用'GetProperty()'時使用了錯誤的引用。它按照你所描述的那樣工作。謝謝。 – sharptooth

相關問題