2010-08-03 7 views
211

Je le code suivant:Obtenir le nom du type sans espace de noms complet en C#

return "[Inserted new " + typeof(T).ToString() + "]"; 

Mais

typeof(T).ToString() 

renvoie le nom complet, y compris l'espace de noms

est-il de toute façon à obtenir juste la classe nom (sans qualificatif d'espace de nom?)

+5

Soit dit en passant, écrit 'chaine1 + quoi que ce soit. ToString() + string2' est redondant. Le compilateur insère automatiquement l'appel 'ToString' si vous faites' string1 + anything + string2'. –

+10

pour ne pas sembler dur mais, si vous aviez inspecté quelles propriétés sont disponibles sur l'instance de 'Type' (comme retourné par' typeof (..) ') Je suis sûr que vous le comprendrez vous-même ... –

Répondre

399
typeof(T).Name // class name, no namespace 
typeof(T).FullName // namespace and class name 
typeof(T).Namespace // namespace, no class name 
+2

' Name 'ne prend pas en compte les paramètres de type. – gregsdennis

+39

Ou 'this.GetType(). Name',' this.GetType(). FullName', etc. s'il s'agit d'instances. – avenmore

+1

ne fonctionne pas avec les valeurs nulles –

8

faire usage de (Type Properties)

Name Gets the name of the current member. (Inherited from MemberInfo.) 
Example : typeof(T).Name; 
24

Essayez ceci pour obtenir des 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écursivité), mais il fonctionne. Les sorties ressemblent:

Dictionary<String, Object> 
+2

Cela devrait être la réponse acceptée car elle prend en compte correctement les types génériques qui peuvent recurse (Dictionnaire par exemple). – Otis

4

Après le C# 6.0 (y compris), vous pouvez utiliser nameof expression:

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<T>() => 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" // inside of Method2 ok, inside Method1 is a compiler error 
nameof(Stuff) = "Stuff" 
nameof(T) -> "T" // works inside of method but not in attributes on the method 
nameof(f) -> “f” 
nameof(f<T>) -> syntax error 
nameof(f<>) -> syntax error 
nameof(Method2()) -> error “This expression does not have a name” 
0

meilleure façon d'utiliser:

obj.GetType().BaseType.Name 
+1

S'il vous plaît fournir quelques explications à votre réponse, pour le rendre plus clair pour les autres utilisateurs. –

Questions connexes