属于通用类型

时间:2012-03-17 15:59:35

标签: c# generics

我有一个IRoot的层次结构接口,其中H是层次结构类型,N是节点类型。我想解决一个对象是IRoot类型的问题,我该怎么做...

我看起来像匹配类型,反射界面和isassignedfrom,都不能工作

2 个答案:

答案 0 :(得分:3)

一种方式:

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

请务必阅读GetInterface()上的文档并打开常规类型。这很奇怪,所以了解这里发生的事情很重要。

编辑:您也可以使用typeof(IRoot<,>).Name代替"IRoot`2",以避免使用硬编码字符串。我已经更新了上面的代码来做到这一点。

答案 1 :(得分: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;

这使得它更安全,因为不涉及任何字符串。