You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#动态转换扩展方法优化:解决null转int时的报错问题

问题分析与解决

你的代码目前只处理了DBNull.Value的情况,但忽略了普通null值的场景:

  • 当value为null时,调用value.Equals(DBNull.Value)会直接触发NullReferenceException——因为null对象无法调用实例方法;
  • 即便绕过这一步,Convert.ChangeType(null, typeof(int))也会抛出InvalidCastException,因为值类型int无法直接接收null的转换结果。

修改后的代码

public static T To<T>(dynamic value)
{
    // 先判断null和DBNull,两种情况都返回对应类型的默认值
    if (value == null || value.Equals(DBNull.Value))
        return default(T);
    
    try
    {
        // 执行转换,值类型会自动使用default(T)对应的默认值(比如int的0)
        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch (InvalidCastException)
    {
        // 可选:处理类型不匹配的转换失败场景,这里默认返回对应类型的默认值
        return default(T);
    }
}

额外优化(针对可空值类型)

如果需要更严谨地处理int?这类可空值类型,让null直接转换为可空类型的null而非值类型默认值,可以用以下代码:

public static T To<T>(dynamic value)
{
    if (value == null || value.Equals(DBNull.Value))
    {
        // 区分可空值类型和普通值类型,返回对应结果
        var underlyingType = Nullable.GetUnderlyingType(typeof(T));
        return underlyingType != null ? default(T) : default(T);
    }
    
    try
    {
        // 针对可空类型,转换为其底层值类型再处理
        var targetType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
        return (T)Convert.ChangeType(value, targetType);
    }
    catch (InvalidCastException)
    {
        return default(T);
    }
}

内容的提问来源于stack exchange,提问作者DeveNymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:39:53