Convert.ChangeType处理可空类型和Enum类型时报错

        我们在做一些类型转换处理时,如从DataTable转实体类,或从IDataReader转换为List<T>等时候,都需要对有些类型进行转换,特别是在做反射处理的。通过ChangeType(object value, Type conversionType)能够很好的实现类型的转换。但是可空类型Nullable和Enum转换就会报错,因为这个方法是强制转换,所以对于上面这种类型需要做特殊处理。

 1、处理Nullable:

if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                    return null;
                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
                conversionType = nullableConverter.UnderlyingType;
            }

2、处理Enum:

 if (typeof(System.Enum).IsAssignableFrom(conversionType))
            {
                return Enum.Parse(conversionType, value.ToString());
            }

3、完整方法如下:

 public static object HackType(object value, Type conversionType)
        {
            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                    return null;
                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
                conversionType = nullableConverter.UnderlyingType;
            }
            if (typeof(System.Enum).IsAssignableFrom(conversionType))
            {
                return Enum.Parse(conversionType, value.ToString());
            }
            return Convert.ChangeType(value, conversionType);
        }

 

posted on 2019-07-05 01:03  摩登雄鹰  阅读(603)  评论(0)    收藏  举报

导航