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
上定义的对象
进行隐式转换的内部)。感谢您的贡献。