2012-03-17 135 views
1

我有一個IRoot的層次結構接口,其中H是層次結構類型,N是節點類型。我想工作的對象是否是類型IRoot的,我會怎麼做這個...是泛型類型

我看過的匹配類型反射接口和isassignedfrom,所有不工作

+0

你能告訴我們一些代碼嗎? – 2012-03-17 16:00:43

+0

你可以發佈你到目前爲止的代碼嗎?這並不完全清楚你想要做什麼。 – 2012-03-17 16:00:48

+0

有一個'IRoot ',你想看看一個對象是否實現了這個,而不管'H'和'N'的選擇是什麼? – Jon 2012-03-17 16:03:35

回答

3

方式一:

var ifc = obj.GetType().GetInterface(typeof(IRoot<,>).Name); 
if(ifc != null) { 
    // operate assuming type is IRoot<,> 
} 

請務必閱讀關於GetInterface()的文檔並打開泛型類型。這很奇怪,所以瞭解這裏發生的事情很重要。

編輯:您也可以使用typeof(IRoot<,>).Name代替"IRoot`2"以避免使用硬編碼的字符串。我更新了上面的代碼來做到這一點。

0

除了siride的回答是:

如果你可以改變的IRoot<H, N>定義,使其IRoot<H,N> : IRoot,那麼下面也將工作:

object someInstance = new SomeDerivedClass<TFoo, TBar>(); 
bool isOfRoot = typeof (IRoot).IsInstanceOfType(someInstance); 

甚至

bool isOfRoot = someInstance is IRoot; 

這使得它更安全一些,因爲不涉及任何字符串。

+1

只需使用'typeof(IRoot <,>).Name'來代替對其進行硬編碼即可避開字符串問題。我會更新我的答案。 – siride 2012-03-17 17:31:29

+0

啊,對了,'.Name'是失蹤的一塊。獎勵! – sunside 2012-03-17 17:33:01