返回null,如果通用类型可确定



我正在编写一个函数,该功能检查输出是否为 DBNull并返回null,如果通用类型为nullable nullable。如果没有,它简单地丢弃了错误。

更新:添加了所有建议

public T Get<T>(string key)
{
    int ordinal = reader.GetOrdinal(key);
    if (reader.IsDBNull(ordinal))
    {
        if (typeof(T).GetTypeInfo().IsValueType && Nullable.GetUnderlyingType(typeof(T)) == null) // isn't a nullable field
            throw new InvalidCastException();
        else return default(T);
    }
    return reader.GetFieldValue<T>(ordinal);
}

但是,我不确定default(T)是否返回每个可用字段的null。如果现在还有其他方法可以使其返回null吗?

是的,default(T)是每个实际上是SomeType?/ Nullable<SomeType>null类似于CC_4的值,因此您应该使用的功能正常。

,您可能需要考虑stringbyte[]之类的东西 - 这些也可以也来自数据库,可以是null。

您可能还想考虑如果某人只是犯错并在值为<decimal>时要求<int>的错误应该是什么。这将导致InvalidCastExceptionIDataReader上有一个IsDBNull()方法比使用例外更合适。

最后:更喜欢throw;而不是throw e;

在计算机资源方面,捕获和处理例外是一项极其昂贵的任务。您的方法将异常用作其逻辑流的一部分。这是查看您要解决的问题的一种不正确的方法。

此外,您正在捕获专门的InvalidCastException例外。除了试图施加零参考以外,其他情况可能会发生这种例外。您正在隐藏/歪曲潜在的有效错误;这可能会花费您数小时令人沮丧,拔毛的调试。

以下应为您提供与原始方法相同的行为,但是在集成误差处理过程中没有放松堆栈的开销。

public T Get<T>(string key)
{
    if(reader.IsDbNull(reader.GetOrdinal(key)))
    {
       //IF YOU SPECIFICALLY WANT TO THROW AN ERROR IF A VALUE TYPE
       //if (typeof(T).IsValueType) 
       //{ throw new InvalidCastException(); }
       return default(T);
    }
    return reader.GetFieldValue<T>(reader.GetOrdinal(key));
}

相关内容

最新更新