原文地址:点击打开链接
适用:普通的对象,并且有默认的无参数构造函数
- #region 将一个对象转换为指定类型
- /// <summary>
- /// 将一个对象转换为指定类型
- /// </summary>
- /// <param name="obj">待转换的对象</param>
- /// <param name="type">目标类型</param>
- /// <returns>转换后的对象</returns>
- public static object ConvertToObject(object obj, Type type)
- {
- if (type == null) return obj;
- if (obj == null) return type.IsValueType ? Activator.CreateInstance(type) : null;
-
- Type underlyingType = Nullable.GetUnderlyingType(type);
- if (type.IsAssignableFrom(obj.GetType())) // 如果待转换对象的类型与目标类型兼容,则无需转换
- {
- return obj;
- }
- else if ((underlyingType ?? type).IsEnum) // 如果待转换的对象的基类型为枚举
- {
- if (underlyingType != null && string.IsNullOrEmpty(obj.ToString())) // 如果目标类型为可空枚举,并且待转换对象为null 则直接返回null值
- {
- return null;
- }
- else
- {
- return Enum.Parse(underlyingType ?? type, obj.ToString());
- }
- }
- else if (typeof(IConvertible).IsAssignableFrom(underlyingType ?? type)) // 如果目标类型的基类型实现了IConvertible,则直接转换
- {
- try
- {
- return Convert.ChangeType(obj, underlyingType ?? type, null);
- }
- 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, ConvertToObject(p.GetValue(obj, null), property.PropertyType), null);
- }
- }
- return o;
- }
- }
- return obj;
- }
- #endregion