Antworten:
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name
Name
berücksichtigt keine Typparameter.
this.GetType().Name
, this.GetType().FullName
etc. , wenn sie mit Fällen zu tun.
Name
berü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.Join
temporäre und das LINQ-Lambda werden jedoch ignoriert . Verwenden String
Sie 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! nameof
Der 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.
nameof
gibt nicht den Namen desType
nameof
den Namen des Type
Screenshots mit Beweis überprüft und zurückgegeben : prntscr.com/irfk2c
Type
, sondern nur das Argument zur Kompilierungszeit. Wenn eine Methode ein akzeptiert, IEnumerable
wird nameof
einfach "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.Name
kehrt zurück, "TypeInfo"
was nicht die gewünschte Lösung ist, wie ich es erwarte.
string1 + anything.ToString() + string2
ist übrigens überflüssig. Der Compiler fügt den AufrufToString
automatisch ein, wenn Sie dies tunstring1 + anything + string2
.