2012-03-17 134 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