深复制以及类型转换

 /// <summary>
        /// 深复制
        /// </summary>
        /// <param name="obj">请求对象</param>
        /// <returns>返回对象</returns>
        public static object CopyData(object obj)
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();

                formatter.Serialize(memoryStream, obj);
                memoryStream.Position = 0;

                return formatter.Deserialize(memoryStream);
            }
        }

  

   /// <summary>
        /// 复制实体类中相同类型并且相同名称的属性值
        /// </summary>
        /// <param name="inputEntity">输入实体</param>
        /// <param name="outputEntity">输出实体</param>
        public static void CopyData(object inputEntity, object outputEntity)
        {
            if (inputEntity == null || outputEntity == null)
            {
                return;
            }

            Type inputEntityType = inputEntity.GetType();
            Type outputEntityType = outputEntity.GetType();

            foreach (PropertyInfo inputEntityProperty in inputEntityType.GetProperties())
            {
                foreach (PropertyInfo outputEntityProperty in outputEntityType.GetProperties())
                {
                    object inputValue = inputEntityProperty.GetValue(inputEntity, null);

                    if (inputValue != null
                        && inputEntityProperty.Name == outputEntityProperty.Name
                        && inputEntityProperty.PropertyType.Name == outputEntityProperty.PropertyType.Name)
                    {
                        outputEntityProperty.SetValue(outputEntity, inputValue, null);
                        break;
                    }
                }
            }
        }

  

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Collections;

namespace Hotel.Product.Service.WebService.WebServiceCommon
{
    /// <summary>
    /// 工具类
    /// </summary>
    public class Tool 
    {
        /// <summary>
        /// 类型转换,用于具有相同属性的类的转换
        /// </summary>
        /// <typeparam name="OldType">旧类型</typeparam>
        /// <typeparam name="NewType">新类型</typeparam>
        /// <param name="oldEntity">旧实体</param>
        /// <returns>新实体</returns>
        public static NewType TranslateEntity<OldType, NewType>(OldType oldEntity) 
        {
            NewType newEntity = Activator.CreateInstance<NewType>();
            Type t = typeof(NewType);
            Type oldType = typeof(OldType);
            foreach (PropertyInfo propertyInfo in t.GetProperties())
            {
                if (oldType.GetProperty(propertyInfo.Name) == null)
                {
                    continue;
                }
                object oldValue = oldType.GetProperty(propertyInfo.Name).GetValue(oldEntity, null);
                object newValue = t.GetProperty(propertyInfo.Name).GetValue(newEntity, null);
                if (oldValue != null && oldValue.GetType().Name == (new List<object>()).GetType().Name)
                {
                    IList oldObjList = (IList)oldValue;
                    if(oldObjList.Count<0)
                    {
                        continue;
                    }
                    Type oldValueType = oldObjList[0].GetType();
                    Type newValueType = propertyInfo.PropertyType.GetGenericArguments()[0];

                    IList newObjList = (IList)newValue;
                    foreach (object item in oldObjList)
                    {
                        object newItem = TranslateDynamicsEntity(newValueType, item);
                        newObjList.Add(newItem);
                    }
                    newValue = newObjList;
                }
                else
                {
                    newValue = oldType.GetProperty(propertyInfo.Name).GetValue(oldEntity, null);
                }
                propertyInfo.SetValue(newEntity, newValue, null);
            }
            return newEntity;
        }
        /// <summary>
        /// 类型转换
        /// </summary>
        /// <param name="newEntityType">新实体的类型</param>
        /// <param name="oldEntity">旧实体</param>
        /// <returns>新实体</returns>
        private static object TranslateDynamicsEntity(Type newEntityType, object oldEntity)
        {
            object newEntity = Assembly.GetAssembly(newEntityType).CreateInstance(newEntityType.FullName);
            Type newType = newEntity.GetType();
            Type oldType = oldEntity.GetType();
            foreach (PropertyInfo propertyInfo in newType.GetProperties())
            {
                object oldValue = oldType.GetProperty(propertyInfo.Name).GetValue(oldEntity, null);
                object newValue = newType.GetProperty(propertyInfo.Name).GetValue(newEntity, null);
                if (oldValue != null && oldValue.GetType().Name == (new List<object>()).GetType().Name)
                {
                    IList oldObjList = (IList)oldValue;
                    if (oldObjList.Count < 0)
                    {
                        continue;
                    }
                    Type oldValueType = oldObjList[0].GetType();
                    Type newValueType = propertyInfo.PropertyType.GetGenericArguments()[0];

                    IList newObjList = (IList)newValue;
                    foreach (object item in oldObjList)
                    {
                        object newItem = TranslateDynamicsEntity(newValueType, item);
                        newObjList.Add(newItem);
                    }
                    newValue = newObjList;
                }
                else
                {
                    newValue = oldType.GetProperty(propertyInfo.Name).GetValue(oldEntity, null);
                }
                propertyInfo.SetValue(newEntity, newValue, null);
            }
            return newEntity;
        }
    }
}

  

   /// <summary>
        /// 获取RateCode表一条数据
        /// </summary>
        /// <param name="rateCodeID">主键ID</param>
        /// <returns>RateCode实体</returns>
        internal static SOAEntity.RateCodeEntity GetDataById(int rateCodeID)
        {
            RateCodeEntity productEntity = ProductBusiness.RateCodeBusiness.HotelPubDB.GetDataById(rateCodeID);
            return Tool.TranslateEntity<RateCodeEntity, SOAEntity.RateCodeEntity>(productEntity);
        }

  

posted @ 2012-03-12 15:25  ThirteenYi  阅读(207)  评论(0编辑  收藏  举报