我有以下的一般类:如何测试两个泛型是否具有基类 - 子类关系而不实例化它们?
class Base<T> where T : ... { ... }
class Derived<T> : Base<T> where T : ... { ... }
class Another<T> where T : ... { ... }
class DerivedFromDerived<T> : Derived<T> where T : ... { ... }
某处在我的代码,我想从Base<T>
测试是否一个给定的通用继承,而无需创建通用的特定实例。我怎么做?
static bool DerivedFromBase(Type type) { /* ??? */ }
static void Main(string[] args)
{
Console.WriteLine(DerivedFromBase(typeof(Derived<>))); // true
Console.WriteLine(DerivedFromBase(typeof(Another<>))); // false
Console.WriteLine(DerivedFromBase(typeof(DerivedFromDerived<>))); // true
Console.ReadKey(true);
}
编辑:谢谢你马克。现在我看到了光。我原本试过以下几种:
typeof(Derived<>).BaseType == typeof(Base<>)
显然,这是正确的。 但事实并非如此。问题是Base
的T是不一样的东西Derived
的T.因此,在
typeof(Base<>)
Base
的T
是一个免费的类型。但是,在
typeof(Derived<>).BaseType
Base
的T
势必Derived
的T
,这是又一个免费类型。 (这是如此真棒我会LOVE看到System.Reflection
的源代码!)现在,
typeof(Derived<>).BaseType.GetGenericTypeDefinition()
unbounds Base
的T
。结论:
typeof(Derived<>).BaseType.GetGenericTypeDefinition() == typeof(Base<>)
现在,如果你们都对不起,我的头就在燃烧。
我感兴趣的答案在这里,因为我觉得* *'衍生'不是Base ' –
2011-04-08 22:44:50
@马特·格里尔的'子类:的确,衍生''不'基地'的子类。 –
pyon
2011-04-08 22:50:04
我认为马克已经正确地回答了你的问题,但我认为你可能意味着马特上面提到的其他东西。你能澄清吗? – briantyler 2011-04-08 22:53:51