2 つのオブジェクトを比較し、以下のテストに合格する式クラスが必要です。
public abstract class ComparisonExpression
{
public bool Evaluate(IComparable left, object right)
{
if (left == null && right == null)
return true;
if (left == null || right == null)
return false;
return GetResult(left.CompareTo(right));
}
protected abstract bool GetResult(int comparisonResult);
}
public class AreEqualExpression : ComparisonExpression
{
protected override bool GetResult(int comparisonResult)
{
return comparisonResult == 0;
}
}
// TEST
const int i = 123;
const long l = 123L;
const string s = "123";
Assert.IsTrue(new AreEqualExpression().Evaluate(i, l));
Assert.IsFalse(new AreEqualExpression().Evaluate(i, s));
Assert.IsFalse(new AreEqualExpression().Evaluate(l, s));
IComparable 実装は、指定された型が現在の型と一致することを期待しているようです。「オブジェクトは Int32 型でなければなりません」のような例外が発生しています。
型が等しくない場合は false を返すと思いました。それは例外を防ぎますが、私が望む動作を妨げます。
また、型変換も考えましたが、今度は string と int の比較で true が返されます。これは望ましくありません。
助言がありますか?