c# - 如何编写将 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 null
为return default(T?)
时,编译器很高兴,但该方法不返回null
而是返回默认值Date
,即01.01.0001
.
编写上述通用实用程序方法的正确方法是什么?
解决方案
请检查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;
}
推荐阅读
- python - 在python中以10秒的间隔打印当前时间10次
- asp.net-core - Razor Pages 在页面加载时设置当前日期
- python - 将 SQL 查询的转换从 '::' 重构为整个代码库上的 CAST
- html - 使用 Tampermonkey/Userscript 组织 UL List
- docker - 使用卷挂载将文件从容器复制到本地
- docusaurus - 导入外部 React 组件的捷径是什么?
- c - 为什么 realloc 不调整我的数组的内存大小?
- python - 如何通过传统的计算机视觉方法对特定的头部 CT 区域进行分割和计算?
- sql - 是否可以将数据插入到具有特定主键的表中,即使它是 SQL Server 中的标识
- angular - Angular 材质选择,如何在手机中进行输入转原生?