2010-12-17 5 views
2

Ich habe eine XML-Datei, die ein "Skript" von zu überprüfenden und zu validierenden Elementen enthält. Was es tut, liest einen zu überprüfenden Wert ein, und wenn diese Überprüfung wahr ist, tut es etwas. Ich habe das ursprünglich geschrieben, um nur mit ganzen Zahlen zu arbeiten, aber mir ist klar, dass ich mit mehr Datentypen arbeiten muss.Wie generisch Daten über Code analysieren?

Eine Stichprobenkontrolle wie das ist ... Es sieht wenn EinWert größer ist als 20.

<If field="SomeValue" test="@gt" value="20" /> 

* Das Feld nur einige String-Wert ist. Für ein Double wäre das Feld etwa 55,7.

Alles, was ich tun, ist eine int.TryParse auf den Wert, um zu sehen, ob ich die Zeichenfolge (SomeValue) auf eine ganze Zahl werfen kann. Wenn ich kann, überprüfe ich, ob es größer als 20 ist. Wenn nicht, nehme ich einfach falsch auf dem Scheck an.

Hat jemand irgendwelche Vorschläge, wie ich das mit jedem Datentyp machen könnte? (d. h. string, double, DateTime) Würden Generika funktionieren? Ich habe sie nie benutzt, also weiß ich nicht, ob sie die beste Lösung sein würden. Vielen Dank.

Antwort

1

Der schwierige Bit ist ein Parse, wenn Sie die Typen nicht kennen, aber dies kann mit TypeDescriptor.GetConverter erfolgen:

object knownVal = 21; //perhaps obtained from reflection 
    Type type = typeof(int); 
    string text = "20"; 
    object val = TypeDescriptor.GetConverter(type) 
      .ConvertFromInvariantString(text); 

    int rel = Comparer.Default.Compare(knownVal, val); 

Generics ist eine Option (vor allem mit Comparer<T>.Default.Compare), aber Generika ‚doesn t gut mischen mit Type Werte nur zur Laufzeit bekannt. Es kann gemacht werden (MakeGenericType/MakeGenericMethod), aber es ist hässlich und ein bisschen langsam.

Um ehrlich zu sein, aber: wenn ich es wäre würde ich davon ausgehen, gibt es eine kleine Anzahl von Arten, die hier Handhabung brauchen, und Sonderfall sie.

+0

Aber auch dort verwenden Sie Typ int. Ich suchte eher nach einer Möglichkeit, Werte zu vergleichen (größer als, kleiner als, gleich), ohne einen Typ anzugeben. Nicht sicher, ob das überhaupt möglich ist. – Travyguy9

+0

@ Travyguy9 Ich nehme an, Sie kennen den Typ irgendwann, vielleicht aus dem XML? Ansonsten ist es eine zweideutige Frage. Welches ist größer? '10' oder' 2'? (hängt davon ab, ob es ein int oder ein String ist ...) –

+0

Entschuldigung, Sie haben Recht, ich stimme zu Ich werde wahrscheinlich ein Attribut benötigen, das besagt, dass es sich um diesen Typ handelt. Ich versuche nur zu vermeiden, all diese verschiedenen Arten von Evaluator-Methoden zu schreiben. – Travyguy9