2010-06-09 15 views
2

J'écris un modèle T4 qui charge des classes à partir d'un assemblage, fait une analyse des classes et génère ensuite du code. Une analyse particulière que je dois faire est de déterminer si la classe implémente une liste générique. Je peux le faire simplement en C#, par exemple.Déterminer si une classe implémente une liste générique dans un modèle T4

public class Foo : List<string> { } 

var t = typeof(Foo); 

if (t.BaseType != null && t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == typeof(List<>))) 
    Console.WriteLine("Win"); 

Cependant modèles T4 utiliser le moteur d'introspection FXCop et si vous n'avez pas accès à l'API de réflexion .net. J'ai passé les deux dernières heures dans Reflector mais je n'arrive toujours pas à le comprendre. Quelqu'un at-il des indices sur la façon de le faire?

+0

Je pensais que les modèles T4 étaient compilés en tant que code .NET normal et exécutés comme d'habitude. Êtes-vous en train de dire que «charger certaines classes d'un assemblage» n'est pas fait normalement? Je pense que faire une charge d'assemblage .NET normale vous donnerait un support de réflexion complet, n'est-ce pas? –

+0

Avez-vous regardé http://www.binarycoder.net/fxcop/ comme indiqué par la première question connexe? –

+0

@Lasse Malheureusement, les templates t4 ne peuvent pas utiliser l'API Reflection car elle est optimisée pour l'exécution de code et provoque des problèmes de génération de code (expliqué correctement dans la vue d'ensemble de ce blog http://www.olegsych.com/2007/12/how-to -use-t4-to-generate-decorator-classes /) –

Répondre

0

figured it out, ce n'est pas très jolie, mais en utilisant AssemblyNode.Load chargé de tous les types sont de type TypeNode, pour déterminer si le type implémente la liste que vous devez faire ceci:

node.BaseType.IsGeneric && node.BaseType.Template == FrameworkAssemblies.Mscorlib.Types.SingleOrDefault(t => t.FullName == "System.Collections.Generic.List`1") 

aide quelqu'un espère que cela!

+0

Au lieu de faire correspondre par nom, vous pouvez utiliser FrameworkTypes.GenericList. –

0

J'ai téléchargé Introspector à partir de http://www.binarycoder.net/fxcop/ (comme je l'ai mentionné dans mon commentaire) et il semble que vous deviez vérifier BaseType ou BaseClass Template.

+0

Introspector ne m'a malheureusement pas donné plus d'informations que Reflector. –