C# 將一個物件轉換為指定型別

衣舞晨風發表於2015-09-08

原文地址:點選開啟連結

適用:普通的物件,並且有預設的無引數建構函式

  #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


相關文章