C# 是泛型的
我有一个IRoot的层次结构接口,其中H是层次结构类型,N是节点类型。我想知道如果一个对象是IRoot类型的,我该怎么做 我一直在寻找匹配的类型、反射接口和isassignedfrom,所有这些都不能以一种方式工作: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
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;