2017-10-14 5 views
2

J'essaie de générer du code pour une série de classes génériques en utilisant T4.nom de classe avec paramètres génériques?

Je veux savoir comment obtenir le nom complet de la classe en utilisant la réflexion?

public class Foo<TFirst, TSecond> {} 

var type = typeof(Foo<,>); 
var name = type.FullName; // returns "Foo`2" 

ce que je veux est le nom complet avec les noms de paramètres génériques réels que j'ai écrit

"Foo<TFirst, TSecond>" 

Notez qu'ils ne sont pas un type connu, comme je l'ai dit que je suis génération de code en utilisant T4, donc Je veux avoir un nom exact pour l'utiliser pour les générations de code, par exemple, dans les méthodes génériques.

J'ai essayé this answers mais ils ont besoin de passer le type connu ce qui n'est pas ce que je veux.

Répondre

4

Vous pouvez accéder aux noms des paramètres de type par réflexion en utilisant Type.GetGenericArguments:

using System; 

public class Foo<TFirst, TSecond> {} 

class Test 
{ 
    static void Main() 
    { 
     var type = typeof(Foo<,>); 
     Console.WriteLine($"Full name: {type.FullName}"); 
     Console.WriteLine("Type argument names:"); 
     foreach (var arg in type.GetGenericArguments()) 
     { 
      Console.WriteLine($" {arg.Name}"); 
     } 
    } 
} 

Notez que ce type est donner paramètre noms parce que vous avez utilisé la définition de type générique; si vous avez utilisé var type = typeof(Foo<string, int>); vous obtiendrez String et Int32 énumérés

Je n'ai pas écrit de moi T4, donc je ne sais pas si cela est une utilité pour vous (ainsi qu'une plus type.FullName.) - pour pour arriver à Foo<TFirst, TSecond> vous auriez besoin d'écrire un peu de logique de manipulation de chaîne. Cependant, c'est le seul moyen que je connaisse pour obtenir le type arguments/paramètres.

+1

Vous devez utiliser 'arg.Name' au lieu de' arg.FullName' il semble, parce que 'arg.FullName' dans votre exemple de code retourne' null' (alors que 'arg.Name' renvoie le nom correct). – Evk

+0

@Evk: Merci d'avoir remarqué cela. J'avais d'abord essayé avec 'arg.Name', et j'ai pensé que je le changerais en' arg.FullName' quand je l'écrirais, pour donner l'exemple System.String/System.Int32. Va réparer maintenant! –

+0

Oh merci, j'ai essayé 'string.Join (", ", type.GetGenericArguments(). Sélectionnez (t => t.FullName))' aussi, mais parce que j'utilisais FullName, il retournait null. –