2011-04-08 31 views
5

我有以下的一般类:如何测试两个泛型是否具有基类 - 子类关系而不实例化它们?

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<>) 

BaseT是一个免费的类型。但是,在

typeof(Derived<>).BaseType 

BaseT势必DerivedT,这是又一个免费类型。 (这是如此真棒我会LOVE看到System.Reflection的源代码!)现在,

typeof(Derived<>).BaseType.GetGenericTypeDefinition() 

unbounds BaseT。结论:

typeof(Derived<>).BaseType.GetGenericTypeDefinition() == typeof(Base<>) 

现在,如果你们都对不起,我的头就在燃烧。

+0

我感兴趣的答案在这里,因为我觉得* *'衍生'不是Base ' – 2011-04-08 22:44:50

+0

@马特·格里尔的'子类:的确,衍生''不'基地'的子类。 – pyon 2011-04-08 22:50:04

+0

我认为马克已经正确地回答了你的问题,但我认为你可能意味着马特上面提到的其他东西。你能澄清吗? – briantyler 2011-04-08 22:53:51

回答

6

不知道这是你在找什么,但我认为“IsAssignableFrom”会做到这一点。

class Program 
{ 
    class Base<T> { } 
    class Derived<T> : Base<T> { } 
    class Another<T> { } 
    class DerivedFromDerived<T> : Derived<T> { } 

    static bool DerivedFromBase<T>(Type type) 
    { 
     return typeof(Base<T>).IsAssignableFrom(type); 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine(DerivedFromBase<int>(typeof(Derived<int>)));   // true  
     Console.WriteLine(DerivedFromBase<int>(typeof(Another<int>)));   // false  
     Console.WriteLine(DerivedFromBase<int>(typeof(DerivedFromDerived<int>))); // true 
     Console.ReadKey(true); 
    } 
} 

来处理开放式基类型:

static bool DerivedFromBase(Type type) 
    { 
     Type openBase = typeof(Base<>); 

     var baseType = type; 

     while (baseType != typeof(Object) && baseType != null) 
     { 
      if (baseType.GetGenericTypeDefinition() == openBase) return true; 

      baseType = baseType.BaseType; 
     } 
     return false; 
    } 
+0

虽然这可能不是你要找的,因为你在原始代码typeof(Derived <>)中处理开放泛型类型,而不是为T提供具体类型。 – MarkPflug 2011-04-08 22:48:38

+0

我需要该函数在开放泛型上工作。否则......我将不得不重新思考(最重要的是,重做!)我的工作大约一周。 – pyon 2011-04-08 22:51:24

+0

是的,我认为可能是这样。增加了一个开放式测试的样本。希望可以帮助你。 – MarkPflug 2011-04-08 22:58:53

0

我来到了这个版本,虽然它似乎有点哈克。

private static bool IsDerivedFrom(Type derivedType, Type baseType) 
{ 
    if (derivedType.BaseType == null) 
     return false; 

    if (derivedType.BaseType.GUID == baseType.GUID) 
     return true; 

    return IsDerivedFrom(derivedType.BaseType, baseType); 
} 

它依赖于具有不同的GUID所有类型的,这应该是真实的,但下周四明显的碰撞会发生。

+0

为什么指导?为什么不直接比较? – nawfal 2013-08-28 09:52:22

相关问题