Gegeben eine Art Instanz, wie eine generische Typ-Namen in C#?
Gegeben ein generischer Typ, einschließlich
List<string>
Nullable<Int32>
wie bekomme ich ein generischer name für C#?
var t = typeof(Nullable<DateTime>);
var s = t.GetGenericTypeDefinition().Name + "<" + t.GetGenericArguments()[0].Name + ">";
Diese Erträge
"Nullable`1<DateTime>"
aber ich brauche
"Nullable<DateTime>"
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich Sie bereits akzeptiert eine Antwort, aber ganz ehrlich, diese Antwort ist nicht genug, um dazu zuverlässig, wenn Sie kombinieren Sie einfach, was es mit dem, was du schon geschrieben hast. Es ist auf dem richtigen Weg, aber dein code funktioniert nur für generische Typen mit genau einen generischen parameter, und es funktioniert nur, wenn der generische Typ-parameter selbst ist nicht generisch!
Dies ist eine Funktion (geschrieben als eine Erweiterung Methode), die sollte eigentlich in allen Fällen funktionieren:
Diese Funktion ist rekursiv und sicher. Wenn Sie führen Sie es auf dieses input:
Erhalten Sie diese (korrekte) Ausgabe:
Während die akzeptierte Lösung ist gut nur für den Namen oder für eine nicht verschachtelte vollständigen Namen (durch ersetzen von Namen, vollständiger name, wie in @Ose-E Antwort), aber für geschachtelte Typen, die es immer noch nicht funktionieren, und auch nicht für arrays von generischen Typen.
So, hier ist eine Lösung, die funktioniert, (aber beachten Sie, dass diese Lösung werden nur die tatsächlichen Argumente, nur, wenn alle Argumente gesetzt sind, und in anderen Worten, selbst wenn die Deklaration Typ geliefert hat, geben Sie arguemts, solange der innerste generischen Typ nicht, es wird immer noch nicht angezeigt, auch für die Basis).
Dies ist meine Lösung, es ist auch Arbeit für verschachtelte Klassen und generics:
Kleine Ergänzung zu @Aaronaught
Name
zuFullName
? Ich bin mir nicht sicher, ob das wesentlich ändern genug, um zu rechtfertigen, eine alternative Antwort - es sollte wohl wurden geschrieben als Kommentar.