首页 > 解决方案 > 如何编写将 DBNull 值转换为 Nullable 的通用方法?

问题描述

我有一个带有可为空列的数据库foo_date,其中 Npgsql 将 sqlNULL值映射到 C# 类的实例DBNull。在我的 C# 聚合中,我使用DateTime?所述列的类型。所以问题是如何轻松转换DBNull为可空类型。

我想编写一个实用方法,例如,

public static class DbUtil
{
    public static T? CastToNullable<T>(object obj)
    {
        if (DBNull.Value.Equals(obj))
           return null;
        return (T)obj;
    }
}

我想这样使用:

IDataRecord rec = ...
DateTime? fooDate = DbUtil.CastToNullable<DateTime>(rec["foo_date"]);

但是,我得到编译器错误:

错误 CS0403 无法将 null 转换为类型参数“T”,因为它可能是不可为空的值类型。考虑改用“默认(T)”。

当我替换return nullreturn default(T?)时,编译器很高兴,但该方法不返回null而是返回默认值Date,即01.01.0001.

编写上述通用实用程序方法的正确方法是什么?

标签: c#npgsql

解决方案


请检查Nullable结构,它实际上是长/真实版本T?

在这种情况下,您的方法将是

public static T? CastToNullable<T>(object obj) where T: struct
{
    if (DBNull.Value.Equals(obj))
       return null;
    return new Nullable<T>((T)obj);
}

这仅适用于结构,对于您可以添加的引用类型

public static T CastToNullableObj<T>(object obj) where T: class
{
    if (DBNull.Value.Equals(obj))
       return null;
    return (T)obj;
}

推荐阅读