为DBNull的简明使用? (三元?)
-
27-09-2019 - |
题
似乎有一个在三元操作某种类型的混淆。我知道,这已经在其他SO线程得到解决,但它始终与nullables。此外,对于我来说,我真的只是寻找一个更好的办法。
我想能够使用
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
而是我坚持了这一点:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
在三元操作失败,因为没有为DBNull和字符串之间没有转换成为可能,并为愚蠢的作为似乎考虑价值为对象,编译器踢回给我,我不得不照顾。在回答这个问题的可空版本是只投空字符串,并用它做;的DBNull不能被转换为字符串,虽然如此,没有运气。
是否有一个更简明的方式来做到这一点(不使用nullables,顺便?)
谢谢!
解决方案
您可以将您的第一条语句更改为:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
其他提示
在的 Value
强> 属性的类型object
的,所以应该投射到object
,不string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
或者你可以添加扩展的方法,如:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
然后你可以只说
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(来自菲尔哈克改编)
可读和简洁,没有?
关于使用什么?空合并运算符有关的更多细节?操作者
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
不隶属于 StackOverflow