Ich versuche eine Datenkonvertierung durchzuführen. Leider befinden sich viele Daten in Zeichenfolgen, in denen es sich um int oder double usw. handeln sollte.
Was ich also habe, ist so etwas wie:
double? amount = Convert.ToDouble(strAmount);
Das Problem bei diesem Ansatz ist, wenn strAmount leer ist. Wenn es leer ist, soll der Wert null sein. Wenn ich ihn also zur Datenbank hinzufüge, ist die Spalte null. Also schrieb ich Folgendes:
double? amount = null;
if(strAmount.Trim().Length>0)
{
amount = Convert.ToDouble(strAmount);
}
Jetzt funktioniert das gut, aber ich habe jetzt fünf Codezeilen anstelle von einer. Dies macht das Lesen etwas schwieriger, insbesondere wenn ich eine große Anzahl von Spalten konvertieren muss.
Ich dachte, ich würde eine Erweiterung der String-Klasse und der Generika verwenden, um den Typ zu übergeben. Dies liegt daran, dass es sich um ein Double, ein Int oder ein Long handeln kann. Also habe ich das versucht:
public static class GenericExtension
{
public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
{
if (s.Trim().Length > 0)
{
return (Nullable<T>)s;
}
return null;
}
}
Aber ich bekomme die Fehlermeldung: Kann Typ 'string' nicht in 'T konvertieren?'
Gibt es einen Weg, dies zu umgehen? Ich bin nicht sehr vertraut mit dem Erstellen von Methoden mit Generika.
quelle
Antworten:
Beachten Sie auch, dass die Zeichenfolge selbst möglicherweise null ist.
quelle
Sie können versuchen, die folgende Erweiterungsmethode zu verwenden:
So können Sie Folgendes tun:
quelle
Was ist damit:
Dies berücksichtigt natürlich nicht den Konvertierungsfehler.
quelle
Ich habe diesen generischen Typkonverter geschrieben. Es funktioniert mit Nullable- und Standardwerten und konvertiert zwischen allen konvertierbaren Typen - nicht nur zwischen Zeichenfolgen. Es behandelt alle Arten von Szenarien, die Sie erwarten würden (Standardwerte, Nullwerte, andere Werte usw.)
Ich benutze dies seit ungefähr einem Jahr in Dutzenden von Produktionsprogrammen, daher sollte es ziemlich solide sein.
quelle
OutOfMemoryException
wenn Sie es nicht auf einen festen Satz von Ausnahmetypen eingrenzen können.Vielleicht möchten Sie versuchen:
Führen Sie Ihre eigene Nullprüfung durch und geben Sie sie
int?
gegebenenfalls zurück. Sie werden das auch in a einwickeln wollentry {}
quelle
Probieren Sie es aus ...
Dann nenne es so ...
quelle
Ich mag Joels Antwort, aber ich habe sie leicht modifiziert, da ich kein Fan von Essensausnahmen bin.
quelle
Sie können Folgendes mit Objekten verwenden, dies funktioniert jedoch leider nicht mit Zeichenfolgen.
Ich verwende es zum Umschließen einer Sitzungsvariablen in eine Eigenschaft (auf einer Basisseite). Meine tatsächliche Verwendung ist also (auf meiner Basisseite):
Ich kann in der Seitenlogik nach Null suchen:
quelle
CType(Object, Nullable(Of Double))
funktioniert gut mit StringsDaran führt kein Weg vorbei. Nullable sowie Ihre Methode dürfen nur Werttypen als Argument verwenden. String ist ein Referenztyp und daher mit dieser Deklaration nicht kompatibel.
quelle
quelle
Es gibt eine generische Lösung (für jeden Typ). Die Benutzerfreundlichkeit ist gut, aber die Implementierung sollte verbessert werden: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Auf diese Weise können Sie sehr sauberen Code wie folgt schreiben:
und auch:
quelle
typeName.IndexOf
? Wirklich?) Und seltsamem Verhalten ist (die gezeigteTryConvert
Funktion behandelt Nullwerte nicht einmal richtig).Hier ist etwas basierend auf der akzeptierten Antwort. Ich habe den Versuch / Fang entfernt, um sicherzustellen, dass nicht alle Ausnahmen verschluckt und nicht behandelt werden. Stellen Sie außerdem sicher, dass die Rückgabevariable (in der akzeptierten Antwort) niemals zweimal umsonst initialisiert wird.
quelle
Mein Beispiel für anonyme Typen:
quelle
Eine andere Variante. Dieses
NotSupportedException
wenn der Typ nicht konvertiert werden kannstring
. Zum Beispiel eine benutzerdefinierte Struktur ohne Typkonverter.(T?)null
wenn die Zeichenfolge nicht analysiert werden kann. Sie müssen nicht nach Nullen oder Leerzeichen suchen.quelle
Fügen wir dem Stapel eine weitere ähnliche Lösung hinzu. Dieser analysiert auch Enums und sieht gut aus. Sehr sicher.
https://github.com/Pangamma/PangammaUtilities-CSharp/blob/master/PangammaUtilities/Extensions/ToNullableStringExtension.cs
quelle
Die generische Antwort von " Joel Coehoorn " ist gut.
Dies ist jedoch ein anderer Weg, ohne diese
GetConverter...
odertry/catch
Blöcke zu verwenden ... (Ich bin nicht sicher, aber dies kann in einigen Fällen eine bessere Leistung haben):Die Verwendung ist wie folgt:
quelle
TypeDescriptor.GetConverter
... Codes. Dies ist nur ein anderer Weg.