反射を使用した比較演算子
-
04-10-2019 - |
質問
Reflectionを使用して、実行時に2つの値を比較したいと思います。私はこれにcomparer.default.compare(x、y)を使用していましたが、これは適切ではないことに気付きました。ダブルを単一と比較したいとしましょう(1.0 == 10)。 Comparer.Defaultは、両方の値が同じタイプ(double)でなければならないと主張するため、例外をスローします。ただし、これには明示的な変換が存在します。これは、実際に使用したいものです。
では、なぜconvert.changeTypeを使用できないのですか? 1.25> 1(double> integer)のケースを取ります。 1.25でConvert.ChangeType(1.25、Typeof(int))を試してみると、1が取得されます。
だから、誰かがタイプが定義する明示的な比較(それが存在する場合)を呼び出す方法を提案してもらえますか?
ありがとう。
解決
C#4と.NET 4を使用していますか?もしそうなら、動的なタイピングを使用するのは本当に簡単です:
dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever
コンパイラは、すべての適切な変換を実行します。
他のヒント
C#4がオプションの場合、 Jon Skeetのダイナミックを使用するという提案 おそらく理想的です。
そうでない場合は、...
明示的な比較はありません。コンパイラは、コンパイル時に変換を行い、適切な比較を呼び出します。
Convert.ChangeTypeを使用してより広いタイプに変換し、結果を比較することです。すべてのタイプのチェックを処理したくない場合は、通常、両側をに変換できます decimal
値を使用して、単一の比較を使用してそれらを確認します。 decimal
すべての値を適切に処理する必要があります。