Wie kann ich dies beheben, um eine generische Konvertierung in Nullable & lt; T & gt;
Derzeit benutze ich dieses praktischen Umbau-Erweiterung-Methode, um Konvertierungen zwischen Typen:
public static T To<T>(this IConvertible obj)
{
return (T)Convert.ChangeType(obj, typeof(T));
}
Allerdings nicht, wie das konvertieren gültige Werte um null-Werte zulässt, zum Beispiel, dies schlägt fehl:
"1".To<int?>();
Natürlich, 1 ist einfach in eine (int?), aber es kommt die Fehlermeldung:
Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
Dies ist ein offensichtlich Vereinfachtes Beispiel, in Wirklichkeit bin ich es verwenden, um Konvertierungen von string-Typen in etwa so:
packageDb.Quantity = package.package.ElementDeep(Namespace + "PackageQuantity", Namespace + "ActualQuantity", Namespace + "Quantity").ValueOrNull().To<int?>();
Wenn Konvertieren.ChangeType nicht wie null-Werte zulassen, jemand irgendwelche tollen Ideen?
InformationsquelleAutor der Frage TheSoftwareJedi | 2009-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort LukeH
Aber wenn die Konvertierung fehlschlägt, wird eine exception werfen, - nicht wieder eine null als erwartet werden sollte.
InformationsquelleAutor der Antwort Henrique
Habe ich landete mit diesem
Verhält es sich wie die LINQ-extension-Methoden
Single
undSingleOrDefault
undFirst
undFirstOrDefault
.Kurz
To<T>()
versucht zu konvertieren und wirft auf Fehler während derToOrDefault<T>()
versucht zu konvertieren und zurückdefault(T)
auf Fehler.InformationsquelleAutor der Antwort Nick Strupat
Vielleicht fehlt mir der Punkt, aber in der Instanz von Nullable, wie funktioniert Ihre Methode entweder eine Lesbarkeit, Leistung, Wartung oder Vorteil gegenüber einer einfachen Besetzung, wie
(int?)1
?Abgesehen davon, dass vielleicht eine andere Erweiterung Methode?
Bearbeiten
Nach der überprüfung Ihrer Bearbeiten, warum sollte der generische Funktion, die ich angegeben habe, funktionieren nicht als Ersatz für Ihre
To<T>
Funktion in dieser Zeile? Sie können nicht zulassen, dass eine Umstellung auf null-Werte zulässt, der für jede Art (das ist, warumChangeType
funktioniert nicht), weil das generische akzeptiert nur Wert-Typen. Sie müssen entweder eine Funktion verwenden, wie die, die ich zur Verfügung gestellt oder ändern Sie Ihre SignaturTo<T>
nehmen nur die Werte und fügen Sie eine Besondere Hülle fürNullable<T>
.InformationsquelleAutor der Antwort Adam Robinson
Luke ' s Lösung war gut für mich (und offensichtlich bekam sein Stimmen), aber ich vereinfacht es für mich auf diese Weise
da ich erst aus einer Zeichenkette, die nicht von einem Typ...
Gedanken?
InformationsquelleAutor der Antwort Eugenio Miró
Dies ist die Methode, die ich derzeit benutze (ich habe meine Antwort auf SO), es konvertiert von string nullable-Typ:
InformationsquelleAutor der Antwort Nathan Koop
erweitern @LukeH code:
InformationsquelleAutor der Antwort Hossein Shahabi
Diese Methode funktioniert, was Sie brauchen, und es sieht nett aus, während es zu tun.
https://github.com/Pangamma/PangammaUtilities-CSharp/tree/master/src/StringExtensions
InformationsquelleAutor der Antwort Pangamma