运行时从对象隐式转换

Tee*_*jay 5 c# implicit-cast

我们创建Id32Id64构造了包装来自DB的整数和长值,因此可以通过Json转换器(使用专用的自定义转换器)将它们显式处理为ID.

问题是我们从一个Dictionary<string, object>实际上是类似DataRow对象读取这些数据,其中string部分是列的名称,object部分是值.

所以我们使用此代码读取值之前:

int myVal = (int)row["COLUMN"]
Run Code Online (Sandbox Code Playgroud)

我们希望此代码在这些更改后也能继续工作.

但由于row["COLUMN"]object(@ compile-time)隐式转换失败,即使它实际上是Id32(@运行时).

以下显然有效:

int myVal = (Id32)row["COLUMN"]
Run Code Online (Sandbox Code Playgroud)

但有没有办法解决这个问题而不修改读取值的代码?

这是结构代码:

public struct Id32
{
    public readonly int Value;

    public Id32(int id) { this.Value = id; }

    public static implicit operator int(Id32 id) { return id.Value; }

    public static implicit operator Id32(int id) { return new Id32(id); }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 2

在我看来,这不是一个非常不错的解决方案,但它有效(希望有更好的解决方案):如果您使用的dynamic基础类型是在运行时确定的,那么使用隐式强制转换的类型检查将起作用。

我使用过的代码:

dynamic o = new Id32(1);
// dynamic o = row["COLUMN"]; in your case

int myVal = (int)o;
Run Code Online (Sandbox Code Playgroud)

如果换成dynamicobject就会有你现在的情况,失败了。