从对象

时间:2015-07-07 11:07:50

标签: c# implicit-cast

我们创建了Id32Id64结构来包装来自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"]

2 个答案:

答案 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,您将获得当前的状况,但这会失败。