避免重复的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;
    }
}

如果这是不可能的,什么是最干净的方式(避免重复代码)来实现这一点?

避免重复的Null检查(将用户控件作为参数传递)

我建议您只返回一个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代码中进一步分离我们的数据库代码。)