2010-12-17 14 views
2

私は、チェックして検証するアイテムの「スクリプト」を含むXMLファイルを持っています。それはチェックする値を読み込み、そのチェックが真であれば何かを行います。私はもともと整数だけで動作するように書いていましたが、より多くのデータ型で動作させる必要があることを認識しています。コードを使ってデータを一般的に分析する方法は?

サンプルのチェックは、このようなものですsomeValueのは20

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

よりも大きければ...それは、フィールドはいくつかの文字列値です*見ています。だから、倍の場合、フィールドは55.7のようなものになります。

私が行うのはint型です。文字列(SomeValue)を整数にキャストできるかどうかを調べる値です。私ができるならば、私はそれが20より大きいかどうかをチェックする。そうでなければ、私はちょうどチェックで偽と思う。

どのようなデータ型でこれを行うことができますか? (つまり、文字列、倍精度、DateTime) Genericsは機能しますか?私はそれらを使用したことがないので、彼らが最良の解決策になるかどうかはわかりません。ありがとう。 「

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

ジェネリックは(特にComparer<T>.Default.Compare付き)オプションですが、ジェネリックはdoesnの:

答えて

1

トリッキーなビットを使用すると、種類を知らない解析であるが、これはTypeDescriptor.GetConverterで行うことができます実行時にのみ知られているTypeの値とよく混ざります。それは(MakeGenericType/MakeGenericMethod)することができますが、それは醜いと少し遅いです。

正直言って、私の場合はとします。ここでは処理が必要な少数の種類があり、特殊なケースがあります。

+0

でもint型を使用しています。私は型を指定せずに(より大きい、より小さい、等しい)値を比較する方法をもっと探していました。それが可能なのかどうかはわかりません。 – Travyguy9

+0

@ Travyguy9私はおそらくXMLから、ある時点で型を知っていると仮定していますか?そうでなければあいまいな質問です。どちらが大きいですか? '10'か' 2'ですか? (それがintか文字列かによって異なります) –

+0

申し訳ありませんが、あなたはそうです、私はおそらく、この型としてチェックする属性が必要になることに同意します。私はこれらの異なるタイプのエバリュエーターメソッドをすべて書くのをやめようとしています。 – Travyguy9

関連する問題