我的SQLite数据库中有一个可以为空的双列。
从数据库读取时(对于double类型的列),我想将空值转换为“double.NaN”。
目前dapper将空值设置为0,这是我不想要的。
我有什么选择?
我的第一选择是选项1,但我需要帮助修改Dapper。
就个人而言,我会反对这一点; null与NaN不完全相同。如果你真的想这样做,你必须看看GetTypeDeserializer
。执行此操作的代码是使用ILGenerator
动态生成的,并且相当复杂。如果你寻找一条线:
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
如果检测到DbNull
则这是代码分支的位置。它目前所做的只是从堆栈中弹出两个值(值和目标),将它们放在地板上,然后继续。您需要检查float
/ double
作为特殊情况,应用转换,然后将NaN分配给成员。
不过,我重申我的说法,这根本不是一件有效的事情。一个更简单的选择是:
public double? Value {get;set;}
这需要零改变,并将在当前工作。如果你真的希望它被视为不可空的双重,可能:
private double foo = double.NaN;
public double Foo { get { return foo; } set { foo = value; } }
这将默认为NaN
,并在有值时正确实现。