我有一个IRoot的层次结构接口,其中H是层次结构类型,N是节点类型。我想解决一个对象是IRoot类型的问题,我该怎么做...
我看起来像匹配类型,反射界面和isassignedfrom,都不能工作
答案 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;
这使得它更安全,因为不涉及任何字符串。