如何在c#中使用比较运算符与未知类型的盒装数字?

时间:2016-03-09 15:47:39

标签: c# linq reflection linq-expressions comparison-operators

我想构建比较两个对象的值的函数,并且与内置的比较运算符的行为相同。我无法在编译时知道对象的类型,只能将它们作为对象访问。任何依赖于将它们转换为基础类型或将函数更改为通用的解决方案都不会有助于这些原因。

我天真的第一次实施将是:

bool LessThan(object left, object right) {
    return left < right;
}

但不幸的是,这会导致错误

error CS0019: Operator `<' cannot be applied to operands of type `object' and `object'

然后我尝试使用LINQ表达式

bool LessThan(object left, object right) {
    BinaryExpression expression = Expression.Equal(Expression.Constant(left), Expression.Constant(right));
    return (bool) Expression.Lambda(expression).Compile().DynamicInvoke());
}

当两个对象具有相同的类型但是得到类似

的错误时,它会起作用
System.InvalidOperationException : The binary operator LessThan is not defined for the types 'System.Single' and 'System.Double'.

当对象具有不同类型时。

将它们转换为双打然后进行比较是否可以?

bool LessThan(object left, object right) {
    return ((double) Convert.ChangeType(left, typeof(double))
         < ((double) Convert.ChangeType(right, typeof(double));
}

这似乎给出了理想的行为,但我怀疑转换会在某些情况下导致信息丢失。

有关更好解决方案的任何想法吗?

1 个答案:

答案 0 :(得分:3)

我认为最懒的解决方案是:

bool LessThan(dynamic left, dynamic right) {
    return left < right;
}

如果真的无法比较2种类型,这当然会产生运行时异常。

  

这似乎给出了理想的行为,但我怀疑转换会在某些情况下导致信息丢失。

如果您比较DoubleSingle,C#无论如何都会将Single转换为Double。不能比较它们。