我有一个构造函数,其签名看起来像这样:
public Something(UInt64 uid, UInt64? parentUniqueId)
{
// ...
}
使用数据库检索的结果调用构造函数。 parentUniqueId
可能返回为 DBNull
。
目前,调用代码看起来像这样:
var s = new Something(uid: Convert.ToUint64(row[0]), ConvertTo.Unit64(row[1]))
那行不通,所以我尝试(在第二次转换中)执行 (Unit64?)row[1]
;但是,这太吓人了。
这里的挑战是 Something
是一个接受“指定”参数的基类,例如Unit64
并且它是从接受 DataRow
的继承类调用的。所以,你可以想象:
public SomethingSpecific(DataRow row)
: base(
uid: Convert.ToUInt64(row[0]))
// etc...
)
{ }
这可以一行吗?我将如何处理 DBNull
转换?
最佳答案
像这样编写你自己的转换方法:
public static class MyConvert
{
public static UInt64? ToUInt64OrNull(object value)
{
if(Convert.IsDBNull(value) || value == null)
{
return null;
}
else
{
return Convert.ToUInt64(value);
}
}
}
null
和 DBNull
是两个截然不同的值。所以你必须明确地处理它们。
然后像这样使用它:
var s = new Something(uid: Convert.ToUInt64(row[0]), MyConvert.ToUInt64OrNull(row[1]))
假设 row[0]
永远不会是 null
或 DBNull
,但是 row[1]
可以是 DBNull
,然后将作为 null 传递给构造函数。
这就是您在编写子类时使用它的方式:
public SomethingSpecific(DataRow row)
: base(
uid: Convert.ToUInt64(row[0]),
parentUniqueId: MyConvert.ToUInt64OrNull(row[1])
// etc...
)
{ }
关于c# - DBNull 从 DataSet Cast 到 Nullable 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36769621/