我想使用反射在运行时比较两个值。我正在使用comparer.default.compare(x,y)为此,但我已经意识到这还不够。假设我想将双打与单个(1.0 == 10)进行比较。 comparer.default会引发异常,因为它坚持两个值必须是相同的类型(double)。但是,为此存在明确的转换,这确实是我要使用的。

那么,为什么我不能只使用convert.changetype?以1.25> 1(双>整数)为例。如果我尝试在1.25上使用转换。changeType(1.25,typeof(int)),我将获得1,而上面的断言将失败,而实际上1.25> 1> 1。

那么,有人可以建议一种调用一种类型定义的明确比较的方法吗?

谢谢。

有帮助吗?

解决方案

您是否使用C#4和.NET 4?如果是这样,使用动态打字真的很容易:

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

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

其他提示

如果是C#4的选项, 乔恩·斯基特(Jon Skeet)使用动态的建议 很可能是理想的。

如果不是,那就...

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top