329 votes

Obtenir le nom du type sans l'espace de noms complet

J'ai le code suivant :

return "[Nouveau " + typeof(T).ToString() + " inséré]";

Mais

 typeof(T).ToString()

renvoie le nom complet incluant l'espace de noms

Y a-t-il un moyen d'obtenir simplement le nom de la classe (sans aucun qualificatif d'espace de noms) ?

8 votes

Soit dit en passant, écrire string1 + anything.ToString() + string2 est redondant. Le compilateur insère automatiquement l'appel à ToString si vous faites string1 + anything + string2.

17 votes

Pour ne pas être trop dur, aviez-vous inspecté les propriétés disponibles sur l'instance Type (telle que retournée par typeof(..)) je suis certain que vous auriez pu le découvrir vous-même...

0 votes

Pour une raison inconnue, la Name propriété est manquante dans la documentation - du moins, elle n'est pas là où je la cherchais.

585voto

Tim Robinson Points 28696
typeof(T).Name // nom de la classe, sans espace de noms
typeof(T).FullName // espace de noms et nom de la classe
typeof(T).Namespace // espace de noms, sans nom de classe

6 votes

Nom ne prend pas en compte les paramètres de type.

83 votes

Ou cette.GetType().Name, cette.GetType().FullName, etc. s'il s'agit d'instances.

3 votes

Nom ne prend pas non plus en compte les types imbriqués !

38voto

gregsdennis Points 724

Essayez ceci pour obtenir les paramètres de type pour les types génériques:

public static string CSharpName(this Type type)
{
    var sb = new StringBuilder();
    var name = type.Name;
    if (!type.IsGenericType) return name;
    sb.Append(name.Substring(0, name.IndexOf('`')));
    sb.Append("<");
    sb.Append(string.Join(", ", type.GetGenericArguments()
                                    .Select(t => t.CSharpName())));
    sb.Append(">");
    return sb.ToString();
}

Peut-être pas la meilleure solution (en raison de la récursion), mais cela fonctionne. Les sorties ressemblent à ceci:

Dictionary<String, Object>

3 votes

Cela devrait être la réponse acceptée car elle prend correctement en compte les types génériques pouvant être récursifs (Dictionary par exemple).

0 votes

+1 pour le concept. Mais je n'aime pas l'échec de l'optimisation prématurée. Cela crée un nouveau StringBuilder dans chaque appel récursif (même dans le cas de base lorsqu'il n'est pas utilisé), mais ignore le temporaire de string.Join et le lambda LINQ. Utilisez simplement String jusqu'à ce que vous sachiez que c'est un goulot d'étranglement. /rant

1 votes

Nigel, il est écrit ici que ce n'est probablement pas la meilleure solution :)

10voto

Stas Boyarincev Points 1147

Après le C# 6.0 (inclus), vous pouvez utiliser l'expression nameof:

using Stuff = Some.Cool.Functionality  
class C {  
    static int Method1 (string x, int y) {}  
    static int Method1 (string x, string y) {}  
    int Method2 (int z) {}  
    string f() => nameof(T);  
}  

var c = new C()  

nameof(C) -> "C"  
nameof(C.Method1) -> "Method1"   
nameof(C.Method2) -> "Method2"  
nameof(c.Method1) -> "Method1"   
nameof(c.Method2) -> "Method2"  
nameof(z) -> "z" // à l'intérieur de Method2 ok, à l'intérieur de Method1 est une erreur de compilation  
nameof(Stuff) = "Stuff"  
nameof(T) -> "T" // fonctionne à l'intérieur d'une méthode mais pas dans les attributs de la méthode  
nameof(f) -> “f”  
nameof(f) -> erreur de syntaxe  
nameof(f<>) -> erreur de syntaxe  
nameof(Method2()) -> erreur “Cette expression n'a pas de nom”  

Remarque! nameof n'obtient pas le Type d'objet sous-jacent au moment de l'exécution, il s'agit simplement de l'argument au moment de la compilation. Si une méthode accepte un IEnumerable, alors nameof renvoie simplement "IEnumerable", alors que l'objet réel pourrait être "List".

10voto

Pranay Rana Points 69934

Utiliser (les propriétés du Type)

 Nom   Obtient le nom du membre actuel. (Hérité de MemberInfo.)
 Exemple : typeof(T).Nom;

5voto

Datoon Points 302

Vous pouvez le faire :

typeof(T).Nom;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X