2013-06-12 12 views
5
class Program 
{ 
    static void Main(string[] args) { 
     Check(new Foo()); 
     Check(new Bar()); 
    } 
    static void Check<T>(T obj) { 
     // "The type T cannot be used as type parameter..." 
     if (typeof(T).IsSubclassOf(typeof(Entity<T>))) { 
      System.Console.WriteLine("obj is Entity<T>"); 
     } 
    } 
} 
class Entity<T> where T : Entity<T>{ } 
class Foo : Entity<Foo> { } 
class Bar { } 

Was ist der richtige Weg, um dieses Ding kompilieren zu lassen? Ich könnte Entity<T> aus einer nicht generischen Klasse EntityBase Unterklasse, oder einfach versuchen, typeof(Entity<>).MakeGenericType(typeof(T)) und sehen, ob es gelingt, aber gibt es einen Weg, der try { } catch { } blockiert nicht oder mauls die Typhierarchie?Ermitteln, ob Typ eine Unterklasse eines generischen Typs ist

Es gibt einige Methoden auf Type, die aussehen wie sie nützlich sein könnte, wie GetGenericArguments und GetGenericParameterConstraints aber ich bin völlig ratlos, wie sie verwenden ...

+1

möglich Duplikat [Überprüfen Sie, ob eine Klasse von einer generischen Klasse abgeleitet ist] (http://stackoverflow.com/questions/457676/check-if-a-class-is-derived-from-a- generic-class) –

+0

vielen dank, das beantwortet die frage – user1096188

+0

, aber ich habe keine Ahnung, wie diese Frage zu löschen/schließen .... – user1096188

Antwort

4

So etwas wie dies funktionieren sollte.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication4 { 
    class Program { 
     static void Main(string[] args) { 
      Check(new Foo()); 
      Check(new Bar()); 
      Console.ReadLine(); 
     } 
     static void Check<T>(T obj) { 
      // "The type T cannot be used as type parameter..." 
      if (IsDerivedOfGenericType(typeof(T), typeof(Entity<>))) { 
       System.Console.WriteLine(string.Format("{0} is Entity<T>", typeof(T))); 
      } 
     } 

     static bool IsDerivedOfGenericType(Type type, Type genericType) { 
      if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) 
       return true; 
      if (type.BaseType != null) { 
       return IsDerivedOfGenericType(type.BaseType, genericType); 
      } 
      return false; 
     } 
    } 
    class Entity<T> where T : Entity<T> { } 
    class Foo : Entity<Foo> { } 
    class Bar { } 
} 
Verwandte Themen