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); }
浙公网安备 33010602011771号