답변:
안타깝게도 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
!!
DB Null로 작업하기 위해 VB 애플리케이션을위한 무리를 만들었습니다. VB의 내장 Cxxx 함수와 비슷하기 때문에 Cxxx2라고 부릅니다.
내 CLR 확장 프로젝트에서 볼 수 있습니다.
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())
슈퍼 절름발이 대신 :
if (foo == null)
Object
개체 가 필요 하고 개체가 Nothing이면 (정확히이 Q에서 테스트하려는 경우) 확장 클래스가 작동 할 인스턴스가 없으므로 NullObject 예외가 발생합니다.
this.BinaryExists = vModel.BinaryExists ?? 0;
해야했습니다this.BinaryExists = vModel.BinaryExists ?? false;
.