Answers:
可悲的是,没有等效于与DBNull一起使用的null合并运算符。为此,您需要使用三元运算符:
newValue = (oldValue is DBNull) ? null : oldValue;
(object)oldValue ?? (object)DBNull.Value)
将((object)oldValue == null) ? (object)DBNull.Value : (object)oldValue
与Robert Rossney的解决方案所解决的问题不同。
public static T isNull<T>(this T v1, T defaultValue)
{
return v1 == null ? defaultValue : v1;
}
myValue.isNull(new MyValue())
new MyValue()
即使myValue
不为null并且不需要时,也将执行!!
使用等于方法:
object value2 = null;
Console.WriteLine(object.Equals(value2,null));
为了使用DB Null,我为我的VB应用程序创建了一堆。我将它们称为Cxxx2,因为它们类似于VB的内置Cxxx函数。
您可以在我的CLR Extensions项目中看到它们
http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967
你写两个函数
//When Expression is Number
public static double? isNull(double? Expression, double? Value)
{
if (Expression ==null)
{
return Value;
}
else
{
return Expression;
}
}
//When Expression is string (Can not send Null value in string Expression
public static string isEmpty(string Expression, string Value)
{
if (Expression == "")
{
return Value;
}
else
{
return Expression;
}
}
他们工作得很好
我一直在DataRow类型上使用以下扩展方法:
public static string ColumnIsNull(this System.Data.DataRow row, string colName, string defaultValue = "")
{
string val = defaultValue;
if (row.Table.Columns.Contains(colName))
{
if (row[colName] != DBNull.Value)
{
val = row[colName]?.ToString();
}
}
return val;
}
用法:
MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");
我首先检查该列是否存在,因为如果查询结果中没有该列的非null值,则DataTable对象甚至不会提供该列。
使用以下方法。
/// <summary>
/// Returns replacement value if expression is null
/// </summary>
/// <param name="expression"></param>
/// <param name="replacement"></param>
/// <returns></returns>
public static long? IsNull(long? expression, long? replacement)
{
if (expression.HasValue)
return expression;
else
return replacement;
}
/// <summary>
/// Returns replacement value if expression is null
/// </summary>
/// <param name="expression"></param>
/// <param name="replacement"></param>
/// <returns></returns>
public static string IsNull(string expression, string replacement)
{
if (string.IsNullOrWhiteSpace(expression))
return replacement;
else
return expression;
}
public static T IsNull<T>(this T DefaultValue, T InsteadValue)
{
object obj="kk";
if((object) DefaultValue == DBNull.Value)
{
obj = null;
}
if (obj==null || DefaultValue==null || DefaultValue.ToString()=="")
{
return InsteadValue;
}
else
{
return DefaultValue;
}
}
//This method can work with DBNull and null value. This method is question's answer
这只是开个玩笑,因为问题有点傻。
public static bool IsNull (this System.Object o)
{
return (o == null);
}
这是一个扩展方法,但是它扩展了System.Object,因此您现在使用的每个对象都有一个IsNull()方法。
然后,您可以通过执行以下操作来节省大量代码:
if (foo.IsNull())
而不是超级la脚:
if (foo == null)
Object
在其上运行的实际对象,并且如果该对象为Nothing(恰恰是您要在此Q中测试的情况),则扩展类没有实例可操作,因此它将抛出NullObject异常。
this.BinaryExists = vModel.BinaryExists ?? 0;
为this.BinaryExists = vModel.BinaryExists ?? false;
。