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
相关产品推荐
相关产品推荐

