我有一个带有签名的构造函数,如下所示:
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
转换?
答案 0 :(得分:3)
编写自己的转换方法,如下所示:
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...
)
{ }
答案 1 :(得分:1)
多一点防御性编程怎么样? E.g。
var s = new Something(uid: row[0] != null ? Convert.ToUInt64(row[0]) : default(UInt64), parentUniqueId: row[1] != null ? Convert.ToUInt64(row[1]) : default(UInt64?));
这不好,但它可以解决问题。