2011-06-24 193 views
2

是否有运营商或内置功能simplyfy此:??运营商system.DBNull

myVal = object1.object2.something(a,b).dataColumn.toString()==""?object1.object2.something(a,b).dataColumn.toString():"-"; 

我知道我可以这样做:

string str = object1.object2.something(a,b).dataColumn.toString(); 
myVal =str==""?"-":str; 

,但我有很多目标,我想避免:

string str1 = object1.object2.something(a,b).dataColumn1.toString(); 
myVal1==""?str1:"-" 
string str2 = object1.object2.something(a,b).dataColumn2.toString(); 
myVal2==""?str2:"-" 
: 
string strN = object1.object2.something(a,b).dataColumnN.toString(); 
myValN==""?strN:"-" 

我还可以创建一个功能:

private string CheckNull(object dataColumn){ 
    return dataColumn == System.DBNull?"-":dataColumn.toString(); 
} 

myVal1 = CheckNull(object1.object2.something1(a,b).dataColumn.toString()) 
myVal2 = CheckNull(object1.object2.something2(a,b).dataColumn.toString()) 
myVal3 = CheckNull(object1.object2.something3(a,b).dataColumn.toString()) 

最简单的方法是使用??运算符,但问题是'dataColumn'不兼容?因为有时会返回一个system.DBNull而不是null。看着眼前的窗口输出:

System.DBNull??"-" 
'System.DBNull' is a 'type', which is not valid in the given context 
null??"-" 
"-" 

我不知道是否有一些(串)函数或运算符可以返回“ - ”如果dataColumn.toString()==“”没有if..then(因为我将不得不作出的所有的人都很多if..then否则,我宁愿用上面所示的函数方法

string str = object1.object2.something(a,b).dataColumn.toString().if("","-"); 

回答

3

如何:。

public static class StringHelper { 
    public static string ValueOrDash(this string value) { 
     return string.IsNullOrEmpty(value) ? "-" : value; 
    } 
} 

然后,你可以这样做:

myVal = object1.object2.something(a,b).DataColumn.ToString().ValueOrDash(); 

或者更好的是:

public static class StringHelper { 
    public static string ValueOrWhatever(this string value, string defaultValue) { 
     return string.IsNullOrEmpty(value) ? defaultValue : value; 
    } 
} 

myVal = object1.object2.something(a,b).DataColumn.ToString().ValueOrWhatever("-"); 
+0

太棒了!我不知道如何重写/扩展字符串函数。谢谢! – tutetimas

0

你可以写一个扩展方法对DataColumn的调用。虽然它在功能上与您的CheckNull方法没有多大区别。

或者在你的第一个例子中,str1,str2,strN等等,是否有你不能重复使用str1的理由?我看到你在一长串代码中有一个方法调用,你不会想要浪费比你需要的时间更多的时间(特别是如果它每次都会产生相同的输出)。

1

如果底层的对象是总是字符串或DBNull的,你可以使用as类型转换操作符:

private string CheckNull(object dataColumn){ 
    return dataColumn == (dataColumn as string)??"-":dataColumn; 
} 

这也将返回“ - ”如果值是例如或者一些整数其他类型。

这不是从你的代码清晰,但如果这些值是从数据行来,你可以使用新的(.NET 3.5)DataRowExtensions.Field功能,这将返回null而不是DbNull