我们创建了Id32
和Id64
结构来包装来自DB的整数和长值,因此可以通过Json转换器(使用专用的自定义转换器)将它们显式处理为ID。
问题是我们从Dictionary<string, object>
读取了这个数据,这个数据实际上是一个类似DataRow
的对象,其中string
部分是列的名称和{{1} } part是值。
所以之前我们有这个代码来读取值:
object
我们希望此代码在这些更改后也能继续工作。
但由于int myVal = (int)row["COLUMN"]
是row["COLUMN"]
(@ compile-time),隐式转换会失败,即使它实际上是object
(@运行时)。
以下显然有效:
Id32
但是有没有办法解决这个而不修改读取值的代码?
这是结构代码:
int myVal = (Id32)row["COLUMN"]
答案 0 :(得分:3)
我认为,不能修改您的检索代码 int myVal = (int)row["COLUMN"]
,这是不可能的。
您需要向object
添加隐式强制转换(至int
),这是无法完成的。有很多方法可以让你自己的演员变得简单,但我能想到的每个人,或者你会发现here需要改变这一行。
即使你没有改变它,我猜你将不得不重新编译它 - 所以如果你重新编译它,为什么不改变呢?有一些重构工具可以使成千上万的这些行很容易。
答案 1 :(得分:2)
在我看来,这不是一个非常体面的解决方案,但它有效(希望有更好的解决方案):如果你使用dynamic
底层类型是在运行时确定的,那么使用隐式转换的类型检查将工作
我使用的代码:
dynamic o = new Id32(1);
// dynamic o = row["COLUMN"]; in your case
int myVal = (int)o;
如果您将dynamic
更改为object
,您将获得当前的状况,但这会失败。