Erhalte GenericType-Name in gutem Format mit Reflection auf C #

8

Ich muss den Namen des generischen Typs in Form seiner Deklaration im Code bekommen.

Zum Beispiel: Für Liste & lt; Int32 & gt; Ich möchte String "List & lt; Int32 & gt;" erhalten. Die Standart-Eigenschaft Type.Name gibt in dieser Situation "List'1" zurück.

EDIT: Beispiel wurde behoben

    
AndreyAkinshin 07.10.2009, 17:40
quelle

6 Antworten

11

Ok, ich habe einige Nachforschungen angestellt und festgestellt, dass typeof (List) "GetGenericArguments" enthält, mit denen Sie die Unternamen erhalten. Also würde ich es so machen (für einen generischen Typ, wenn es ein Multi ist, wird es eine Schleife oder so etwas nehmen. Ich kann eine Funktion dafür auf Anfrage veröffentlichen.

Hier ist eine Funktion, um es mit mehreren generischen Argumenten zu tun, behandelt 'verschachtelte' generische Typen. Nochmals bearbeitet, um dies mit der Aggregatfunktion zu tun:

%Vor%     
Erich 07.10.2009, 18:26
quelle
13

Mit eingebauten Funktionen und Linq kann dies geschrieben werden

%Vor%

HINWEIS: In einer älteren Version von C # benötigt der Compiler explizit .ToArray() :

%Vor%     
CaringDev 13.08.2014 13:20
quelle
3

Das ist nicht zu schwer. ; -)

Okay, ich beiße ... g Der untenstehende arbeitet rekursiv und zeigt primitive Typen ohne Namensraum (wie das OP geschrieben hat):

%Vor%

Der resultierende bereinigteName sieht folgendermaßen aus: System.Collections.Generic.Dictionary<System.Collections.Generic.List<Int32>, ConsoleApplication2.Program+SomeType>

    
Robert Giesecke 07.10.2009 18:28
quelle
0

Ein anderes Beispiel habe ich mir selbst geschrieben, bevor ich hier stolperte.

%Vor%     
mamidon 25.05.2016 17:20
quelle
0

Alte Frage, aber ich habe das heute nur nötig. Also habe ich eine Erweiterungsmethode geschrieben, die einen gut aussehenden C # -formatierten generischen Namen ausgeben kann, der verschachtelte generische Typen mit mehreren Ebenen verarbeiten kann.

%Vor%     
Amry 14.12.2016 09:15
quelle
-1

Nun, das ist, weil der Name des Typs in .NET tatsächlich List1 ist. Die "1" ist die sogenannte Arität des generischen, und es sagt Ihnen, wie viele Typparameter es gibt.

Es ist erforderlich, damit Sie mehr als einen generischen Typ mit demselben "Namen" aber einer anderen Anzahl von generischen Typparametern erstellen können.

Zum Beispiel gibt es mehr als einen Typ namens "System.Action". Die wirklichen Namen von diesen sind System.Action'1, System.Action'2, System.Action'3 etc.

Wenn Sie also wissen, dass Ihr Typ generisch ist, können Sie davon ausgehen, dass am Ende des Namens "XX" steht, also können Sie diesen Teil einfach wegschneiden, zum Beispiel so:

%Vor%

PS: Bitte ersetzen Sie 'mit'.

    
Maximilian Mayerl 07.10.2009 17:53
quelle

Tags und Links