Ich versuche, eine Reihe ähnlicher Methoden zu einer generischen Methode zu kombinieren. Ich habe mehrere Methoden, die den Wert eines Querystrings zurückgeben, oder null, wenn dieser Querystring nicht existiert oder nicht im richtigen Format vorliegt. Dies wäre einfach genug, wenn alle Typen von Haus aus nullwertfähig wären, aber ich muss den generischen Typ nullbar für Ganzzahlen und Datumsangaben verwenden.
Folgendes habe ich jetzt. Es wird jedoch eine 0 zurückgegeben, wenn ein numerischer Wert ungültig ist, und dies ist in meinen Szenarien leider ein gültiger Wert. Kann mir jemand helfen? Vielen Dank!
public static T GetQueryString<T>(string key) where T : IConvertible
{
T result = default(T);
if (String.IsNullOrEmpty(HttpContext.Current.Request.QueryString[key]) == false)
{
string value = HttpContext.Current.Request.QueryString[key];
try
{
result = (T)Convert.ChangeType(value, typeof(T));
}
catch
{
//Could not convert. Pass back default value...
result = default(T);
}
}
return result;
}
ChangeType
Fehler auftritt.Antworten:
Was ist, wenn Sie den Standardwert angegeben haben, der zurückgegeben werden soll, anstatt Standard (T) zu verwenden?
Es macht es auch einfacher, es anzurufen:
Der Nachteil ist, dass Sie magische Werte benötigen, um ungültige / fehlende Querystring-Werte zu kennzeichnen.
quelle
long ? test
wobei der Standardwert null sein sollteIch weiß, ich weiß, aber ...
quelle
Try
Muster sollte jedem .NET-Entwickler bekannt sein. Es ist keine schlechte Sache, wenn Sie mich fragen. In F # oder NET 4.0 würden Sie Option (oder Auswahl)Was ist damit? Ändern Sie den Rückgabetyp von
T
nachNullable<T>
quelle
where T : struct
.string
es ein istnullable
Wert istSie können eine Art Vielleicht-Monade verwenden (obwohl ich Jays Antwort vorziehen würde)
Ihre Methode würde folgendermaßen aussehen:
quelle
Convert.ChangeType()
behandelt nullfähige Typen oder Aufzählungen in .NET 2.0 BCL nicht korrekt (ich denke, es ist jedoch für BCL 4.0 behoben). Lassen Sie den Konverter mehr Arbeit für Sie erledigen, anstatt die äußere Implementierung komplexer zu gestalten. Hier ist eine Implementierung, die ich verwende:Dann kann Ihre Implementierung von GetQueryString <T> wie folgt sein:
quelle
Ich beginne gerne mit einer Klasse wie dieser. Klasseneinstellungen {public int X {get; set;} public string Y {get; einstellen; } // nach Bedarf wiederholen
Dies hat bei Hunderten von Projekten gut funktioniert. Sie können eine der vielen anderen Parsing-Lösungen verwenden, um Werte zu analysieren.
quelle