转换盒装字节

s.m*_*.m. 6 c# casting

我正在尝试编写一个扩展方法,给定一个值,它将返回

  • 价值本身如果不同于 DBNull.Value
  • value's类型的默认值

是的,这不是最清楚的解释,也许一些代码会使我想要完成的事情显而易见.

public static T GetValueOrDefault<T>(this object value) {
    if (value == DBNull.Value)
        return default(T);
    else
        return (T)value;
}
Run Code Online (Sandbox Code Playgroud)

只要value盒装类型相同T,此方法就可以正常工作.

真正的乐趣踢时,类型是不同的,比如装箱值是byteTint.

是否有一种优雅的方式使这项工作?

手工做一些类型检查从如第一投objectbyte,然后从byteT,当然是行不通的.

编辑

建议的解决方案也应该与枚举一起使用,而不仅仅是"标准"类型.

Chr*_*ter 4

使用与数据库值完全匹配的类型参数调用您的方法,然后将其转换为您实际想要的内容,例如

int result = (int) row["NullableByteColumn"].GetValueOrDefault<byte>();
Run Code Online (Sandbox Code Playgroud)

我认为这是合理的,因为代码清楚地区分了这里起作用的两个不同概念:

  • 将数据库值读入正确的等效 .NET 数据类型。
  • 将数据库访问层类型映射到所需的业务逻辑层类型。

int如果所需的数据类型距离更远并且需要更复杂的转换(例如枚举、字符串或日期偏移量),则这种责任分离就变得更加重要。