gpt4 book ai didi

.NET Dapper 可空转换错误

转载 作者:行者123 更新时间:2023-12-02 00:08:25 24 4
gpt4 key购买 nike

使用 .NET Dapper,我在获取包含整数值 (0/1) 的数据库字段以映射到类中的可为 null 的 bool 属性时遇到问题。

为简单起见,我已将类精简并重命名为重现问题所需的最低限度:

public class Test
{
public bool? TestField { get; set; }
}

如果调用下面的代码来填充Test类:

var Results = DBConnection.Query<Test>("SELECT 0 As TestField]").ToList();

将抛出以下错误:

Invalid cast from 'System.Int32' to 'System.Nullable`1[[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

如果我删除问号,使该字段成为不可空的 bool 值(即公共(public) bool TestField),一切正常。

立即回答可能会删除可空值并收工。然而,不起作用的原因是因为我们正在使用同一个类来序列化进出 Web 服务的记录,并且我们需要能够分辨 false 和 null 之间的区别。我想过有两个类,一个有可为空的属性类型,一个没有,但是我又增加了维护两个类而不是一个类的开销。

在属性集期间自定义数据转换将是理想的。不过,我在 dapper 文档中没有发现任何东西表明这是可能的。

最佳答案

看起来 Dapper 代码中可能存在关于可空 bool/long 等的问题。

这里是源代码中的三行(行 2375-2377 版本 1.12.1.1)。问题在第一行:

il.Emit(OpCodes.Ldtoken, unboxType); // stack is now [target][target][value][member-type-token]
il.EmitCall(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"), null); // stack is now [target][target][value][member-type]
il.EmitCall(OpCodes.Call, typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(Type) }), null); // stack is now [target][target][boxed-member-type-value]

发出此代码时,它等同于以下代码行:

Convert.ChangeType(0, typeof(bool?));

不幸的是,这引发了我所看到的错误。通过将上面的第一行 il.Emit( ) 更改为以下内容:

il.Emit(OpCodes.Ldtoken, nullUnderlyingType ?? memberType); // stack is now [target][target][value][member-type-token]

生成的等效代码行变成这样,注意末尾的 typeof(bool?) 后面不再有可为 null 的问号:

Convert.ChangeType(0, typeof(bool));

这行代码不会抛出错误。

所以解决方案是重新编译源代码。我会将此更改提交回项目以供他们审查,看看这是否会导致任何不需要的副作用。

关于.NET Dapper 可空转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16971087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com