Antworten:
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name
Nameberücksichtigt keine Typparameter.
this.GetType().Name, this.GetType().FullNameetc. , wenn sie mit Fällen zu tun.
Nameberücksichtigt auch keine verschachtelten Typen!
Versuchen Sie dies, um Typparameter für generische Typen abzurufen:
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 (aufgrund der Rekursion), aber es funktioniert. Die Ausgaben sehen wie folgt aus:
Dictionary<String, Object>
StringBuilder(auch der Basisfall, wenn er nicht verwendet wird), das string.Jointemporäre und das LINQ-Lambda werden jedoch ignoriert . Verwenden StringSie es einfach, bis Sie wissen, dass es sich um einen Engpass handelt. / rant
Nutzen Sie ( Type Properties )
Name Gets the name of the current member. (Inherited from MemberInfo.)
Example : typeof(T).Name;
Nach C # 6.0 (einschließlich) können Sie den Namen des Ausdrucks verwenden:
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”
Hinweis! nameofDer Laufzeittyp des zugrunde liegenden Objekts wird nicht abgerufen, sondern nur das Argument zur Kompilierungszeit. Wenn eine Methode eine IEnumerable akzeptiert, gibt nameof einfach "IEnumerable" zurück, während das eigentliche Objekt "List" sein könnte.
nameofgibt nicht den Namen desType
nameofden Namen des TypeScreenshots mit Beweis überprüft und zurückgegeben : prntscr.com/irfk2c
Type, sondern nur das Argument zur Kompilierungszeit. Wenn eine Methode ein akzeptiert, IEnumerablewird nameofeinfach "IEnumerable" zurückgegeben, während das eigentliche Objekt "List <string>" sein könnte. Es glaubt nicht, dass es die Frage des OP beantwortet.
beste Verwendung:
obj.GetType().BaseType.Name
obj.GetType().BaseType.Namekehrt zurück, "TypeInfo"was nicht die gewünschte Lösung ist, wie ich es erwarte.
string1 + anything.ToString() + string2ist übrigens überflüssig. Der Compiler fügt den AufrufToStringautomatisch ein, wenn Sie dies tunstring1 + anything + string2.