使用IsAssignableFrom泛型 [英] Using IsAssignableFrom with generics
问题描述
使用反射,我试图找到一套从给定的基类继承的类型。它没有多久找出简单的类型,但我难倒当谈到仿制药。
Using reflection, I'm attempting to find the set of types which inherit from a given base class. It didn't take long to figure out for simple types, but I'm stumped when it comes to generics.
有关这块code,第一IsAssignableFrom返回true,但第二个返回false。然而,最终的分配编译就好了。
For this piece of code, the first IsAssignableFrom returns true, but the second returns false. And yet, the final assignment compiles just fine.
class class1 { }
class class2 : class1 { }
class generic1<T> { }
class generic2<T> : generic1<T> { }
class Program
{
static void Main(string[] args)
{
Type c1 = typeof(class1);
Type c2 = typeof(class2);
Console.WriteLine("c1.IsAssignableFrom(c2): {0}", c1.IsAssignableFrom(c2));
Type g1 = typeof(generic1<>);
Type g2 = typeof(generic2<>);
Console.WriteLine("g1.IsAssignableFrom(g2): {0}", g1.IsAssignableFrom(g2));
generic1<class1> cc = new generic2<class1>();
}
}
那么,如何在运行时确定一个通用的类型定义是否从另一个派生?
So how do I determine at run time whether one generic type definition is derived from another?
推荐答案
从回答另一个问题:
public static bool IsAssignableToGenericType(Type givenType, Type genericType)
{
var interfaceTypes = givenType.GetInterfaces();
foreach (var it in interfaceTypes)
{
if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
return true;
}
if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
return true;
Type baseType = givenType.BaseType;
if (baseType == null) return false;
return IsAssignableToGenericType(baseType, genericType);
}
(如果你喜欢的答案,请给予好评链接的答案,因为code是不是我的。)
(If you like the answer please upvote the linked answer since the code isn’t mine.)
这篇关于使用IsAssignableFrom泛型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!