我想拥有比较两个对象的表达式类,并通过以下测试。
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。它可以防止异常,但它可以控制我想要的行为。
此外我还考虑过类型转换,但这次字符串和int比较将返回true,这是我不想要的。
有什么建议吗?
答案 0 :(得分:0)
如果您定义此助手类
public static class NumericalHelper {
public static double AsDouble(this object value, out bool success) {
if (value is sbyte || value is byte || value is short || value is ushort || value is int || value is uint || value is long || value is decimal || value is ulong || value is float || value is double || value.GetType().IsEnum) {
success = true;
return Convert.ToDouble(value);
}
success = false;
return 0;
}
}
你可以像这样进行比较:
public bool Evaluate(IComparable left, object right) {
if (left == null && right == null)
return true;
if (left == null || right == null)
return false;
bool isNumerical;
double leftValue = left.AsDouble(out isNumerical);
double rightValue = isNumerical ? right.AsDouble(out isNumerical) : 0;
if (isNumerical)
return GetResult(Comparer<Double>.Default.Compare(leftValue, rightValue));
else {
if (left.GetType() == right.GetType())
return GetResult(left.CompareTo(right));
else
return false;
}
但要注意,通过与Equals
方法或IEquatable
接口进行通用比较,在您的示例中根本没有考虑到这一点。 Here is more information about implementing equality。这对我来说似乎是一个问题,这在使用当前的类设计时并不合适。