我们创建Id32并Id64构造了包装来自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)
在我看来,这不是一个非常不错的解决方案,但它有效(希望有更好的解决方案):如果您使用的dynamic基础类型是在运行时确定的,那么使用隐式强制转换的类型检查将起作用。
我使用过的代码:
dynamic o = new Id32(1);
// dynamic o = row["COLUMN"]; in your case
int myVal = (int)o;
Run Code Online (Sandbox Code Playgroud)
如果换成dynamic你object就会有你现在的情况,失败了。
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |