Nullable 类型的转换
今天碰到Nullable 不能通过Convert.ChangeType转换,辛苦在网上找到两个解决方法,共享一下。
1.The PumaCode.org Blog
 public object ChangeType(object value, Type conversionType)
public object ChangeType(object value, Type conversionType)
 {
{
 if ( conversionType.IsGenericType &&
    if ( conversionType.IsGenericType &&
 conversionType.GetGenericTypeDefinition( ).Equals( typeof( Nullable<> ) ) ) {
        conversionType.GetGenericTypeDefinition( ).Equals( typeof( Nullable<> ) ) ) {
 
 
 if(value == null)
        if(value == null)
 return null;
            return null;
 
 
 System.ComponentModel.NullableConverter nullableConverter
        System.ComponentModel.NullableConverter nullableConverter
 = new System.ComponentModel.NullableConverter(conversionType);
            = new System.ComponentModel.NullableConverter(conversionType);
 
 
 conversionType = nullableConverter.UnderlyingType;
        conversionType = nullableConverter.UnderlyingType;
 }
    }
 
 
 return Convert.ChangeType(value, conversionType);
    return Convert.ChangeType(value, conversionType);
 }
引用:http://blog.pumacode.org/2006/05/18/using-convert-changetype-on-nullable-types/
}
引用:http://blog.pumacode.org/2006/05/18/using-convert-changetype-on-nullable-types/
2.Paul Wilson's .NET Blog
 public class DataTypeConverter
public class DataTypeConverter
 {
    {
 public static object ChangeType(Type type,object value)
        public static object ChangeType(Type type,object value)
 {
        {
 if ((value == null) && type.IsGenericType)
            if ((value == null) && type.IsGenericType)
 {
            {
 return Activator.CreateInstance(type);
                return Activator.CreateInstance(type);
 }
            }
 if (value == null)
            if (value == null)
 {
            {
 return null;
                return null;
 }
            }
 if (type == value.GetType())
            if (type == value.GetType())
 {
            {
 return value;
                return value;
 }
            }
 if (type.IsEnum)
            if (type.IsEnum)
 {
            {
 if (value is string)
                if (value is string)
 {
                {
 return Enum.Parse(type, value as string);
                    return Enum.Parse(type, value as string);
 }
                }
 return Enum.ToObject(type, value);
                return Enum.ToObject(type, value);
 }
            }
 if (!type.IsInterface && type.IsGenericType)
            if (!type.IsInterface && type.IsGenericType)
 {
            {
 Type type1 = type.GetGenericArguments()[0];
                Type type1 = type.GetGenericArguments()[0];
 object obj1 = DataTypeConverter.ChangeType(type1,value);
                object obj1 = DataTypeConverter.ChangeType(type1,value);
 return Activator.CreateInstance(type, new object[] { obj1 });
                return Activator.CreateInstance(type, new object[] { obj1 });
 }
            }
 if ((value is string) && (type == typeof(Guid)))
            if ((value is string) && (type == typeof(Guid)))
 {
            {
 return new Guid(value as string);
                return new Guid(value as string);
 }
            }
 if ((value is string) && (type == typeof(Version)))
            if ((value is string) && (type == typeof(Version)))
 {
            {
 return new Version(value as string);
                return new Version(value as string);
 }
            }
 if (!(value is IConvertible))
            if (!(value is IConvertible))
 {
            {
 return value;
                return value;
 }
            }
 return Convert.ChangeType(value, type);
            return Convert.ChangeType(value, type);
 }
        }
 }
这个代码是WilsonORMapper中的QueryHelper类,不好意思,我Reflector了一下。
    }
这个代码是WilsonORMapper中的QueryHelper类,不好意思,我Reflector了一下。
引用:http://weblogs.asp.net/pjohnson/archive/2006/02/07/437631.aspx
1.The PumaCode.org Blog
 public object ChangeType(object value, Type conversionType)
public object ChangeType(object value, Type conversionType) {
{ if ( conversionType.IsGenericType &&
    if ( conversionType.IsGenericType && conversionType.GetGenericTypeDefinition( ).Equals( typeof( Nullable<> ) ) ) {
        conversionType.GetGenericTypeDefinition( ).Equals( typeof( Nullable<> ) ) ) { 
  if(value == null)
        if(value == null) return null;
            return null; 
  System.ComponentModel.NullableConverter nullableConverter
        System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
            = new System.ComponentModel.NullableConverter(conversionType); 
  conversionType = nullableConverter.UnderlyingType;
        conversionType = nullableConverter.UnderlyingType; }
    } 
  return Convert.ChangeType(value, conversionType);
    return Convert.ChangeType(value, conversionType); }
}2.Paul Wilson's .NET Blog
 public class DataTypeConverter
public class DataTypeConverter {
    { public static object ChangeType(Type type,object value)
        public static object ChangeType(Type type,object value) {
        { if ((value == null) && type.IsGenericType)
            if ((value == null) && type.IsGenericType) {
            { return Activator.CreateInstance(type);
                return Activator.CreateInstance(type); }
            } if (value == null)
            if (value == null) {
            { return null;
                return null; }
            } if (type == value.GetType())
            if (type == value.GetType()) {
            { return value;
                return value; }
            } if (type.IsEnum)
            if (type.IsEnum) {
            { if (value is string)
                if (value is string) {
                { return Enum.Parse(type, value as string);
                    return Enum.Parse(type, value as string); }
                } return Enum.ToObject(type, value);
                return Enum.ToObject(type, value); }
            } if (!type.IsInterface && type.IsGenericType)
            if (!type.IsInterface && type.IsGenericType) {
            { Type type1 = type.GetGenericArguments()[0];
                Type type1 = type.GetGenericArguments()[0]; object obj1 = DataTypeConverter.ChangeType(type1,value);
                object obj1 = DataTypeConverter.ChangeType(type1,value); return Activator.CreateInstance(type, new object[] { obj1 });
                return Activator.CreateInstance(type, new object[] { obj1 }); }
            } if ((value is string) && (type == typeof(Guid)))
            if ((value is string) && (type == typeof(Guid))) {
            { return new Guid(value as string);
                return new Guid(value as string); }
            } if ((value is string) && (type == typeof(Version)))
            if ((value is string) && (type == typeof(Version))) {
            { return new Version(value as string);
                return new Version(value as string); }
            } if (!(value is IConvertible))
            if (!(value is IConvertible)) {
            { return value;
                return value; }
            } return Convert.ChangeType(value, type);
            return Convert.ChangeType(value, type); }
        } }
    }引用:http://weblogs.asp.net/pjohnson/archive/2006/02/07/437631.aspx
 
                    
                     
                    
                 
                    
                


 conversionType.GetGenericTypeDefinition( ).Equals(
        conversionType.GetGenericTypeDefinition( ).Equals(  
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号