Generelle Typkonvertierung ohne Risiko von Ausnahmen

8

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

  • versucht, die Zeichenfolge in eine DateTime zu konvertieren, um einen Datumsvergleich durchzuführen.
  • Wenn der String nicht in DateTime konvertiert werden kann, führen Sie einen String-Vergleich durch.

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%     
Mongus Pong 21.01.2010, 17:19
quelle

4 Antworten

10

Sind Generika eine Option? Hier ist ein frecher Hack, der die Methode TryParse sucht und sie über einen (im Cache gespeicherten) Delegierten aufruft:

%Vor%     
Marc Gravell 22.01.2010, 20:59
quelle
5

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)

    
ICR 21.01.2010 18:00
quelle
4

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.)

    
Auraseer 21.01.2010 17:56
quelle
0
  

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:

  

Wenn der Hauptdatentyp ein DateTime ist und ich ein String übergeben habe, muss ich

     

Versuchen Sie, die String in eine DateTime zu konvertieren, um einen Date Vergleich durchzuführen.   Wenn das String nicht in ein DateTime konvertiert werden kann, dann führe einen String Vergleich durch.

%Vor%     
jason 21.01.2010 17:28
quelle

Tags und Links