C# 是泛型的

C# 是泛型的,c#,generics,C#,Generics,我有一个IRoot的层次结构接口,其中H是层次结构类型,N是节点类型。我想知道如果一个对象是IRoot类型的,我该怎么做 我一直在寻找匹配的类型、反射接口和isassignedfrom,所有这些都不能以一种方式工作: var ifc = obj.GetType().GetInterface(typeof(IRoot<,>).Name); if(ifc != null) { // operate assuming type is IRoot<,> } var if

我有一个IRoot的层次结构接口,其中H是层次结构类型,N是节点类型。我想知道如果一个对象是IRoot类型的,我该怎么做

我一直在寻找匹配的类型、反射接口和isassignedfrom,所有这些都不能以一种方式工作:

var ifc = obj.GetType().GetInterface(typeof(IRoot<,>).Name);
if(ifc != null) {
    // operate assuming type is IRoot<,>
}
var ifc=obj.GetType().GetInterface(typeof(IRoot).Name);
如果(ifc!=null){
//假设操作类型为IRoot
}
确保阅读
GetInterface()
上的文档并打开泛型类型。这是奇怪的事情,所以了解这里发生了什么很重要


编辑:您还可以使用
typeof(IRoot).Name
代替
“IRoot`2”
,以避免使用硬编码字符串。我已经更新了上面的代码来实现这一点。

除了siride的答案之外:

如果可以更改
IRoot
的定义,使其成为
IRoot:IRoot
,则以下操作也将起作用:

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

这使得它的类型更加安全,因为不涉及字符串。

您能发布到目前为止的代码吗?你想做什么还不完全清楚。有一个
IRoot
,你想看看一个对象是否实现了这一点,而不管
H
N
的选择是什么?如果(obj.GetType()是typeof(IRoot)){'do something}@PhilWhittaker,这是行不通的。@FelixK。他知道,这就是他问这个问题的原因。你可以通过使用
typeof(IRoot).Name而不是硬编码来回避字符串问题。我会更新我的答案。
bool isOfRoot = someInstance is IRoot;