所以我有这个属性,并且想要将值设置为从db返回的值,或者如果它为空则设置为null。可以使用if-else执行此操作,但是为了更清晰的代码,我想使用三元运算符。有人能指出我犯的错误。感谢!!!
public DateTime? OptionExpiration {get;set;}
//actually sets the value to null
if(String.IsNullOrEmpty(dr["OPTION_EXPIRATION"].ToString())){
OptionExpiration = null;
}else{
OptionExpiration = DateTime.Parse(dr["OPTION_EXPIRATION"].ToString());
}
//所以我检查字符串是空还是空,然后尝试设置值但收到此错误:错误2运算符' |'不能应用于''类型的操作数和' System.DateTime?'
String.IsNullOrEmpty(dr["OPTION_EXPIRATION"].ToString())
? OptionExpiration = null
| OptionExpiration = DateTime.Parse(dr["OPTION_EXPIRATION"].ToString())
;
答案 0 :(得分:6)
您使用的是三元运算符错误。
应该是:
OptionExpiration = String.IsNullOrEmpty(Convert.ToString(dr["OPTION_EXPIRATION"]))
? (DateTime?)null
: DateTime.Parse(dr["OPTION_EXPIRATION"].ToString())
;
所以:
assignment = condition ? trueExpression : falseExpression;
如果该字段是数据库中的date
,则最好这样做:
OptionExpiration = Convert.IsDBNull(dr["OPTION_EXPIRATION"])
? (DateTime?)null
: (DateTime)dr["OPTION_EXPIRATION"]
;
答案 1 :(得分:0)
我会使用这样的扩展方法:
public static Nullable<DateTime> AsNullableDateTime(this object item, Nullable<DateTime> defaultDateTime = null)
{
if (item == null || string.IsNullOrEmpty(item.ToString()))
return defaultDateTime;
DateTime result;
if (!DateTime.TryParse(item.ToString(), out result))
return defaultDateTime;
return result;
}
你可以将任何内容传递给它,它会尝试给你一个约会。如果它因任何原因失败(这也会检查以确保您发送的对象不为null),您将获得null返回;这很好,因为你要映射到可以为空的日期时间。
要使用此功能,您可以执行以下操作:
OptionExpiration = dr["OPTION_EXPIRATION"].AsNullableDateTime();
没有混乱,容易理解正在发生的事情,抽象出混乱,并且在解决方案的其他部分可以高度重复使用。