将一个对象转换为指定类型


        /// <summary>
        /// 将一个对象转换为指定类型
        /// </summary>
        /// <param name="obj">待转换的对象</param>
        /// <param name="type">目标类型</param>
        /// <returns>转换后的对象</returns>
        public static object ConvertObjectToType(object obj, Type type)
        {
            if (type == null) return obj;
            if (obj == null) return type.IsValueType ? Activator.CreateInstance(type) : null;

            // 如果目标类型为可空类型,则取可空类型的基类型.
            // case: int? -> int, DateTime? -> DateTime
            Type underlyingType = Nullable.GetUnderlyingType(type);
            // 如果待转换对象的类型与目标类型兼容,则无需转换
            // case: string -> string, int -> int, int -> object, int? -> int?, int? -> object
            if (type.IsAssignableFrom(obj.GetType()))
            {
                return obj;
            }
            // 如果待转换的对象的基类型为枚举
            else if ((underlyingType ?? type).IsEnum)
            {
                // 如果目标类型为可空枚举,且待转换对象为空字符串,则返回null
                if (underlyingType != null && string.IsNullOrEmpty(obj.ToString()))
                {
                    return null;
                }
                else
                {
                    // 如果目标类型为可空枚举,且待转换对象不为空字符串,则先将其转换为基类型的枚举,再转换为可空枚举
                    return Enum.Parse(underlyingType ?? type, obj.ToString());
                }
            }
            // 如果目标类型为可转换类型
            else if (typeof(IConvertible).IsAssignableFrom(underlyingType ?? type))
            {
                try
                {
                    // 将待转换对象转换为目标类型
                    return Convert.ChangeType(obj, underlyingType ?? type);
                }
                catch
                {
                    return underlyingType == null ? Activator.CreateInstance(type) : null;
                }
            }
            else
            {
                // 获取类型转换器
                TypeConverter converter = TypeDescriptor.GetConverter(type);
                // 判断是否支持从待转换对象类型到目标类型的转换
                if (converter.CanConvertFrom(obj.GetType()))
                {
                    // 转换类型并返回
                    return converter.ConvertFrom(obj); 
                }
                ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes);
                if (constructor != null)
                {
                    object o = constructor.Invoke(null);
                    PropertyInfo[] propertys = type.GetProperties();
                    Type oldType = obj.GetType();
                    foreach (PropertyInfo property in propertys)
                    {
                        PropertyInfo p = oldType.GetProperty(property.Name);
                        if (property.CanWrite && p != null && p.CanRead)
                        {
                            property.SetValue(o, ConvertObjectToType(p.GetValue(obj, null), property.PropertyType), null);
                        }
                    }
                    return o;
                }
            }
            return obj;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值