我想在运行时使用反射来比较两个值。我正在使用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。
那么,有人可以建议一种调用类型定义的显式比较(如果存在)的方法吗?
感谢。
答案 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
应该充分处理您的所有值。