2011-06-22 93 views
1

繼承的對象類型:在運行時獲取

class A : IInterface { } 

在運行時:

A instance = new A(); 

instance.GetType(); // returns "A" 

IInterface instance = new A(); 

instance.GetType(); // returns "A" 

object instance = new A(); 
instance.GetType(); // returns "A" 

問題:如何獲得IInterface作爲類型?

回答

2

GetType()將始終爲您提供您擁有實例的類的類型,而不管您對其有何參考。你在你的問題中觀察到了這一點。

如果你總是希望得到的IInterface一種類型的對象,你也可以使用

typeof(IInterface) 

如果您需要的接口列表,其中式工具,您可以使用

instance.GetType().GetInterfaces() 
1

如果你需要檢查一個特定的接口,你可以使用'是'關鍵字 if(instance is IInterface) // do something

2

檢查Type.GetInterface方法:

,而不是試圖讓一個鑄造一些界面的對象,你需要檢查對象實現這樣的接口。如果是這樣,您可以將其轉換爲接口類型,或者如果您打算將該類型打印到某個流中,如果它實現了該接口,則打印它的字符串表示形式。

您可以實現像下一個擴展方法,以使生活更輕鬆:

public static bool Implements<T>(this Type some) 
{ 
    return typeof(T).IsInterface && some.GetInterfaces().Count(someInterface => someInterface == typeof(T)) == 1; 

} 

最後,你可以這樣做:

Type interfaceType = someObject.GetType().Implements<IInterface>() ? typeof(IInterface) : default(Type); 
+0

沒有問題如果接口已知,則進行轉換,但是我根據運行時已知接口進行了一些操作,所以GetInterfaces()集合與此完全匹配。 –

+0

然後你可以按照擴展方法的方法。它會讓你的代碼更清潔,而不是重複你在你的解決方案中多次封裝的東西:) –