C# 强制转换盒式字节

C# 强制转换盒式字节,c#,casting,C#,Casting,我试图编写一个扩展方法,给定一个值,它将返回 值本身,如果它与DBNull.value不同 值类型的默认值 是的,这不是最清楚的解释,也许一些代码会让我想要完成的事情变得显而易见 public static T GetValueOrDefault<T>(this object value) { if (value == DBNull.Value) return default(T); else return (T)value; }

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

  • 值本身,如果它与
    DBNull.value不同
  • 类型的默认值
是的,这不是最清楚的解释,也许一些代码会让我想要完成的事情变得显而易见

public static T GetValueOrDefault<T>(this object value) {
    if (value == DBNull.Value)
        return default(T);
    else
        return (T)value;
}
public static T GetValueOrDefault(此对象值){
if(value==DBNull.value)
返回默认值(T);
其他的
返回(T)值;
}
只要
value
的装箱类型与
T
相同,此方法就可以正常工作

真正有趣的是当类型不同时,例如,装箱值是
byte
T
int

有没有一种优雅的方式来实现这一点

当然,手动执行一些类型检查,首先从
对象
转换到
字节
,然后从
字节
转换到
T
,是行不通的

编辑


建议的解决方案也应适用于枚举,而不仅仅适用于“标准”类型。

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

int result = (int) row["NullableByteColumn"].GetValueOrDefault<byte>();
int结果=(int)行[“NullableByteColumn”]。GetValueOrDefault();
我认为这是合理的,因为代码明确区分了两个不同的概念:

  • 将数据库值读入正确的等效.NET数据类型
  • 将数据库访问层类型映射到所需的业务逻辑层类型
如果所需的数据类型是从
int
中进一步删除的,并且需要更复杂的转换,例如枚举、字符串或日期的日偏移量,那么这种责任分离就变得更为重要。

这对我来说很有效:

class Program
{
    static void Main(string[] args)
    {
        Byte myByte = 5;

        object myObject = (object)myByte;

        int myInt = myObject.GetValueOrDefault<Byte>();
        Console.WriteLine(myInt); // 5

        myObject = DBNull.Value;

        myInt = myObject.GetValueOrDefault<Byte>();
        Console.WriteLine(myInt); // 0

        Console.ReadKey(true);
    }
}

public static class ObjectExtension
{
    public static T GetValueOrDefault<T>(this object value)
    {
        if (value == DBNull.Value)
        {
            return default(T);
        }
        else
        {
            return (T)value;
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字节myByte=5;
对象myObject=(对象)myByte;
int myInt=myObject.GetValueOrDefault();
Console.WriteLine(myInt);//5
myObject=DBNull.Value;
myInt=myObject.GetValueOrDefault();
Console.WriteLine(myInt);//0
Console.ReadKey(true);
}
}
公共静态类对象扩展
{
公共静态T GetValuerDefault(此对象值)
{
if(value==DBNull.value)
{
返回默认值(T);
}
其他的
{
返回(T)值;
}
}
}
公共静态T GetValueOrDefault(此对象值){
if(value==DBNull.value){
返回默认值(T);
}
否则{
如果(typeof(T).IsEnum)value=Enum.ToObject(typeof(T),则转换.ToInt64(value));
return(T)Convert.ChangeType(value,typeof(T));
}
}

这不会编译,
default()
需要
类型
参数,而不是值。你能展示一些你想如何实现这一点的示例代码吗?我只是假设写
default(T)
@CodeCaster Christian Hayter的OP是正确的。对不起,我的错。我会解决它。我可能做错了什么,但这对我来说似乎不起作用,它抛出了一个
InvalidCastException
。嗯,很难猜测值和t的类型,不要让我们猜测。在我的代码中,我也在处理enums,而enums不起作用(虽然它就像
字节
int
大小写的符咒)。是的,枚举很难强制转换,因为它们的基础类型。发布更新。谢谢Christian,这就是我在发布问题之前所做的。我只是想知道是否有一种方法可以从客户端代码中抽象被丢弃的类型,或者这样做是否可以接受。我确信可以抽象被丢弃的类型,但在我看来不是这并不理想,因为它隐藏了代码的意图。谢谢,我倾向于同意。我会在几个小时内接受这个答案,除非有人发布一些开创性的东西。这对我也很有效。但我想出了一个反例(直接来自我正在使用的代码),而不是一个
byte
变量,尝试声明一个
DataTable
,添加一列和一行(包含
(byte)5
),然后
int myInt=dt.Rows[0][“foo”].GetValueOrDefault();
。我承认,这两个示例的不同之处让我难以理解。
    public static T GetValueOrDefault<T>(this object value) {
        if (value == DBNull.Value) {
            return default(T);
        }
        else {
            if (typeof(T).IsEnum) value = Enum.ToObject(typeof(T), Convert.ToInt64(value));
            return (T)Convert.ChangeType(value, typeof(T));
        }
    }