377 Stimmen

Abrufen des Typnamens ohne vollständigen Namespace

Ich habe den folgenden Code:

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

Aber

 typeof(T).ToString()

gibt den vollständigen Namen einschließlich Namespace zurück

Gibt es eine Möglichkeit, nur den Klassennamen (ohne Namespace-Qualifizierer) zu erhalten?

682voto

Tim Robinson Punkte 51702
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

43voto

gregsdennis Punkte 5501

Versuchen Sie dies, um Typparameter für generische Typen zu erhalten:

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();
}

Vielleicht nicht die beste Lösung (wegen der Rekursion), aber es funktioniert. Die Ausgaben sehen wie folgt aus:

Dictionary<String, Object>

10voto

Datoon Punkte 546

Können Sie dies tun:

typeof(T).Name;

10voto

Stas Boyarincev Punkte 3230

Nach C# 6.0 (einschließlich) können Sie mit Name von Ausdruck:

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”  

Achtung! nameof nicht den Laufzeittyp des zugrunde liegenden Objekts, sondern nur das Kompilierzeit-Argument. Wenn eine Methode eine IEnumerable akzeptiert, gibt nameof einfach "IEnumerable" zurück, während das eigentliche Objekt "List" sein könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X