避免重复的Null检查(将用户控件作为参数传递)
本文关键字:控件 用户 参数传递 检查 Null | 更新日期: 2023-09-27 18:25:45
我正在使用一个应用程序,该应用程序从Oracle数据库读取多个日期并将其分配给DateTimePickers
。
dtpAdjSerDt.Value = dr.GetDateTime(iadj_service_date);
但是,由于数据库中的值可能是null
,因此此分配需要进行null检查。
如果值为null,我希望能够创建一个返回默认值的扩展方法。
public static DateTime fSafeGetDateTime(OracleDataReader reader, int colIndex)
{
if (!reader.IsDBNull(colIndex))
return reader.GetDateTime(colIndex);
else
return DateTime.Now;
}
这种方法有一个问题:如果db值为null,那么DateTimePicker.Checked应该为false。但使用我上面建议的策略,它将被设置为真的。
有没有办法让我做这样的事情:
public static DateTime fSafeGetDateTime(OracleDataReader reader, int colIndex, DateTimePicker control)
{
if (!reader.IsDBNull(colIndex))
return reader.GetDateTime(colIndex);
else
{
control.Checked = false;
return DateTime.Now;
}
}
如果这是不可能的,什么是最干净的方式(避免重复代码)来实现这一点?
我建议您只返回一个DateTime?
,并让调用者执行默认操作:
public static DateTime? SafeGetDateTime(this OracleDataReader reader, int colIndex)
{
return reader.IsDBNull(colIndex) ? null
: (DateTime?) reader.GetDateTime(colIndex);
}
现在你可以使用:
DateTime fromReaderOrNow = reader.SafeGetDateTime(1) ?? DateTime.Now;
如果你需要控制部分:
DateTime? fromReader = reader.SafeGetDateTime(1);
if (fromReader == null)
{
control.Checked = false;
}
DateTime fromReaderOrNow = fromReader ?? DateTime.Now;
如果真的需要在多个地方执行此操作,那么您可以封装一个要执行的方法,这样就不会重复SafeGetDateTime
代码。
(老实说,我鼓励您从UI代码中进一步分离我们的数据库代码。)