Ich möchte eine Zeichenfolge in einen generischen Typ wie int
oder date
oder long
basierend auf dem generischen Rückgabetyp konvertieren .
Grundsätzlich Parse<T>(String)
gibt eine solche Funktion ein Element vom Typ zurück T
.
Wenn beispielsweise ein int übergeben wurde, sollte die Funktion int.parse
intern ausgeführt werden.
c#
string
parsing
type-conversion
Karim
quelle
quelle
IConvertable
werden muss, sollten Sie nicht auch das einschränkenT
, dhT ChangeType<T>(this object obj) where T : IConvertable
?obj
das muss seinIConvertible
, aber es gibt keine Möglichkeit, dies zur Kompilierungszeit anzugeben.Es sieht so aus, als wäre ich zu spät, um auf diesen Thread zu antworten. Aber hier ist meine Implementierung:
Grundsätzlich habe ich eine Erweiterungsmethode für die Object-Klasse erstellt. Es behandelt alle Typen, dh nullable, Klassen und Strukturen.
quelle
TypeDescriptor
Gibt es einen bestimmten Grund, warum Sie für nullbare Typen undConvert.ChangeType
für nicht nullbare Typen verwenden? Dieser gesamtetry
Block kann nur aufTypeConverter
2 Codezeilen reduziert werden und funktioniert sowohl für nullbar als auch für nicht nullbar.System.Convert.ChangeType
wird nicht in einen Typ konvertiert. Denken Sie an Folgendes:Diese Konvertierungen sind mit dieser Implementierung von ChangeType möglich .
quelle
sauberere Version von Pranays Antwort
quelle
In .NET gibt es einige Konventionen zum Konvertieren von Objekten eines Typs in einen anderen.
Diese Methoden sind jedoch viel langsamer als die typischen
T.Parse(string)
, verursachen Boxen und beinhalten jedes Mal viele Zuordnungen, wenn Sie einen einzelnen Wert konvertieren möchten.Für ValueString habe ich mich entschieden, eine geeignete statische Analysemethode des Typs mithilfe von Reflection zu finden, einen Lambda-Ausdruck zu erstellen, der ihn aufruft, und den kompilierten Delegaten für die zukünftige Verwendung zwischenzuspeichern ( ein Beispiel finden Sie in dieser Antwort ).
Es greift auch auf die oben erwähnten Methoden zurück, wenn der Typ keine geeignete Analysemethode hat (siehe Abschnitt Leistung in der Readme-Datei).
quelle