2012-12-17 46 views
4

我有什么实际上是自定义消息协议的反序列化类。该类使用反射来检查类的属性和协议映射的属性。这是工作正常,除非值是一个无符号整数(32或64)并被转换为一个整数(32或64)。Convert.ChangeType可以在未经检查的环境中运行吗?

我可以测试(例如if x is int)的属性类型和分支,这些数字类型在unchecked块进行类型转换的代码,但我宁愿保持代码的简单,找到一种方法,使用现有的Convert.ChangeType(value, convertToType)逻辑。有没有办法让这个转换器忽略数字溢出?还是有一种替代方法只使用运行时已知的类型进行投射?

注意:我知道这里有一个根本原因需要修复,但我们目前没有能力更改数据源,传输类型或消息传递协议。

+0

我们在讨论什么版本的框架? –

+0

你是否期待在你的应用程序中'uint'的值不会大于'int.MaxValue'? –

+0

不是我知道的..但是你试图把它抽象出来会得到什么?我会说你失去了看到发生什么事的时候你真的应该知道的能力。 –

回答

1

我想这是一个开发者的本能,不想打开is关键字,一直在那里。无论如何,我会建议你这样做。如果你不使用反射,我会理解引入它的商议,但如果你已经在使用反射...

如果你知道(或猜测)uint不会大于int.MaxValue,那么你可以使用Convert.ToInt32。以防万一,您还应该捕获“OverflowExceptions”。

+0

值肯定可以大于int.MaxValue。如果我知道需要在编译时处理的所有不同类型,我可能会将其吸收并打开“is”,但我甚至不知道传入值是否为数字。 – JRoughan

+0

如果该值可能大于“int.MaxValue”,那么int不是将其存储在您的末尾的正确方法。 –

+0

只是一个观察:你的情况似乎很复杂,开始。有时候你必须变得富有创造力(和肮脏)来处理遗留代码。 –

相关问题