C# 从对象执行运行时隐式强制转换

C# 从对象执行运行时隐式强制转换,c#,implicit-conversion,C#,Implicit Conversion,我们创建了Id32和Id64struct来包装来自DB的整数和长值,因此它们可以通过Json转换器(使用专用的自定义转换器)显式地作为ID处理 问题是,我们从一个字典读取这些数据,该字典实际上是一个类似数据行的对象,其中字符串部分是列的名称,对象部分是值 因此,在我们使用此代码读取值之前: int myVal = (int)row["COLUMN"] 我们希望此代码在这些更改之后也能继续工作 但由于行[“列”]是一个对象(@compile-time),隐式强制转换失败,即使它实际上是一个Id3

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

问题是,我们从一个
字典
读取这些数据,该字典实际上是一个类似
数据行
的对象,其中
字符串
部分是列的名称,
对象
部分是值

因此,在我们使用此代码读取值之前:

int myVal = (int)row["COLUMN"]
我们希望此代码在这些更改之后也能继续工作

但由于
行[“列”]
是一个
对象(@compile-time),隐式强制转换失败,即使它实际上是一个
Id32
(@run-time)

以下显然有效:

int myVal = (Id32)row["COLUMN"]
但是有没有办法在不修改读取值的代码的情况下解决这个问题

这是结构代码:

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); }
}

在我看来,这不是一个很好的解决方案,但它是有效的(希望有更好的解决方案):如果您使用
dynamic
,则底层类型是在运行时确定的,因此隐式强制转换的类型检查将起作用

我使用的代码是:

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

int myVal = (int)o;

如果您将
dynamic
更改为
object
,则您的当前状态将失败。

我认为,如果不修改检索代码
int myVal=(int)row[“COLUMN”]
的约束,这是不可能的

您需要将隐式强制转换添加到
对象
(添加到
int
)中,这是无法完成的。有很多方法可以使你自己的演员阵容变得简单,但我能想到的每个人或者你会发现喜欢的人都需要改变这一行


即使你不改变它,我想你也必须重新编译它——所以如果你重新编译它,为什么不改变它呢?有一些重构工具可以让成千上万的代码变得非常简单。

这确实很有趣。但是我真的不知道是否可以声明一个
字典
。。。我会尝试一下。不,但它当时已经被转换了(如果你在添加到字典之前这样做的话),所以这没关系。不幸的是,那样的话,我们无论如何都需要修改代码来读取值。这工作令人惊讶,但正如你所说的,这是一个肮脏的解决方案。(
var row=newdictionary{{“COLUMN”,newid32(42)};
)好吧,我的错。带有
类型
动态
的字典也可以使用。另请参见:这个问题是关于隐式转换,而不是强制转换。虽然涉及强制转换(您有一个
对象
,需要将其强制转换为
int
,可能是从
Id32
上定义的
对象
进行隐式转换的内部)。感谢您的贡献。