使用Reflection的比较运算符

时间:2010-09-21 15:33:57

标签: c# reflection iequalitycomparer

我想在运行时使用反射来比较两个值。我正在使用Comparer.Default.Compare(x,y),但我已经意识到这还不够。假设我想比较一个double和一个(1.0 == 10)。 Comparer.Default将抛出异常,因为它坚持两个值必须是相同的类型(double)。但是,存在显式转换,这正是我想要使用的。

那么,为什么我不能只使用Convert.ChangeType?以1.25>为例1(双>整数)。如果我在1.25上尝试Convert.ChangeType(1.25,typeof(int)),我将得到1,并且上面的断言将失败,当真正的1.25 IS> 1。

那么,有人可以建议一种调用类型定义的显式比较(如果存在)的方法吗?

感谢。

2 个答案:

答案 0 :(得分:5)

您使用的是C#4和.NET 4吗?如果是这样,使用动态类型非常容易:

dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever

编译器会为您执行所有适当的转换。

答案 1 :(得分:1)

如果C#4是一个选项,Jon Skeet's suggestion of using dynamic很可能是理想选择。

如果不是,那么......

没有明确的比较。编译器在编译时进行转换,然后调用适当的比较。

最好的办法是使用Convert.ChangeType转换为更宽的类型,然后对结果进行比较。如果您不想处理所有类型的检查,通常可以将双方都转换为decimal值,然后使用单个比较来检查它们,因为decimal应该充分处理您的所有值。