Ich arbeite an einem Steuerelement, das eine Reihe verschiedener Datentypen annehmen kann (alles, was IComparable implementiert).
Ich muss in der Lage sein, diese mit einer anderen übergebenen Variable zu vergleichen.
Wenn der Hauptdatentyp eine DateTime ist und ich eine String übergeben habe, muss ich
Ich brauche also einen allgemeinen Weg, um von jedem Typ in einen beliebigen Typ zu konvertieren. Einfach genug .Net bietet uns die Klasse TypeConverter .
Nun kann ich am besten herausfinden, ob die Zeichenfolge in eine DateTime konvertiert werden kann, indem Ausnahmen verwendet werden. Wenn das ConvertFrom eine Ausnahme auslöst, weiß ich, dass ich die Konvertierung nicht durchführen kann und den Zeichenfolgenvergleich durchführen muss.
Das Folgende ist das Beste, was ich habe:
%Vor%Ein Teil unserer Standards bei der Arbeit besagt, dass:
Ausnahmen sollten nur ausgelöst werden, wenn eine Ausnahmesituation - d. Ein Fehler ist aufgetreten.
Aber das ist keine außergewöhnliche Situation. Ich brauche einen anderen Weg.
Die meisten variablen Typen haben eine Methode TryParse , die einen booleschen Wert zurückgibt, mit dem Sie bestimmen können, ob die Konvertierung ist gelungen oder nicht. Aber für TypeConverter ist keine TryConvert-Methode verfügbar. CanConvertFrom ist nur dermines, wenn es möglich ist, zwischen diesen Typen zu konvertieren und nicht Berücksichtigen Sie die tatsächlichen Daten, die konvertiert werden sollen. Die Methode IsValid ist ebenfalls nutzlos.
Irgendwelche Ideen?
BEARBEITEN
Ich kann AS und IS nicht verwenden. Ich kenne keine Datentypen zur Kompilierzeit. Also weiß ich nicht, was zu wie und ist zu !!!
BEARBEITEN
Ok hat den Bastard getroffen. Es ist nicht so sauber wie Marc Gravells, aber es funktioniert (hoffe ich). Danke für den Einfall Marc. Ich werde daran arbeiten, es aufzuräumen, wenn ich die Zeit dazu bekomme, aber ich habe ein paar Bugfixes, mit denen ich mich auseinandersetzen muss.
%Vor% Sind Generika eine Option? Hier ist ein frecher Hack, der die Methode TryParse
sucht und sie über einen (im Cache gespeicherten) Delegierten aufruft:
Wenn es nicht möglich ist, ohne Ausnahmen zu schreiben, können Sie den problematischen Code isolieren, indem Sie ihn wie folgt in eine Methode umwandeln:
%Vor%Idealerweise sollten Sie nullbare Typen als Ausgabeparameter übergeben, sodass null für einen nicht definierten Wert steht (weil es keine Konvertierung durchführen konnte) und nicht für den Standardwert (d. h. 0 für int)
Ich würde argumentieren, dass dieser Code wirklich Ausnahmen auslösen sollte, wenn er keine Conversion herausfinden kann. Wenn die beiden übergebenen Argumente DateTime.Now
und Color.Fuschsia
sind, können Sie keinen sinnvollen Vergleich zwischen ihnen vornehmen, daher ist jeder von Ihnen zurückgegebene Wert falsch. Das ist die Definition der richtigen Zeit, um eine Ausnahme auszulösen.
Wenn Sie unbedingt Ausnahmen vermeiden müssen, ist es nicht möglich, mit beliebigen Typen zu machen, was Sie wollen. Jeder Typ hat seine eigenen Regeln darüber, welche Werte er parsen kann, und der Konverter hat keine Möglichkeit, dies im Voraus zu sagen. (Das heißt, wie Sie bemerkt haben, weiß es, dass Sie manchmal string
in DateTime
konvertieren können, aber es ist nicht dafür gedacht zu wissen, dass "1/1/2010" ein gültiges DateTime
ist. während "Fred" nicht ist.)
Ich brauche also einen allgemeinen Weg, um von jedem Typ in einen beliebigen Typ zu konvertieren. Einfach genug, .Net bietet uns die Klasse
TypeConverter
.
Sie fragen zu viel.
%Vor% Kann ich Cat
in Dog
konvertieren?
Sie werden feststellen, dass Ihr Problem viel einfacher zu lösen ist, wenn Sie genauer (vorzugsweise genau) angeben, wie das Verhalten der Methode aussehen soll. Notieren Sie sich also die erwarteten Eingaben und wie die Ausgabe in jedem möglichen Fall sein soll. Dann sollte Ihre Methode sich selbst schreiben.
Genau jetzt haben wir diese Spezifikation:
%Vor%Wenn der Hauptdatentyp ein
DateTime
ist und ich einString
übergeben habe, muss ichVersuchen Sie, die
String
in eineDateTime
zu konvertieren, um einenDate
Vergleich durchzuführen. Wenn dasString
nicht in einDateTime
konvertiert werden kann, dann führe einenString
Vergleich durch.
Tags und Links c# type-conversion