using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace iWareCommon.Utils
{
    /// 
    /// 用于属性属性赋值操作的帮助类
    /// 
    /// 原对象类
    /// 目标对象类
    public class EntityPropHelper where T:class where S:class
    {
        /// 
        /// 将t中的各个对于的属性值赋值到s中相应的属性
        /// 
        /// 原对象
        /// 目标对象
        /// 以T中的属性名为键,S中的属性名为值的字典
        public static void CopyProp(T t, S s, Dictionary columnMap) 
        {
            Type typeT = typeof(T);
            Type typeS = typeof(S);
                       
            var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
            var sPropDic = new Dictionary();
            var keys = columnMap.Keys;
            var values = columnMap.Values;
            //遍历S的所有属性,将符合修改的存入字典中 
            sProps.ForEach(p => { if (values.Contains(p.Name)) { sPropDic.Add(p.Name, p); } });
            var tProps = typeT.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
            var tPropDic = new Dictionary();
            //遍历S的所有属性,将符合修改的存入字典中 
            tProps.ForEach(p => { if (keys.Contains(p.Name)) { tPropDic.Add(p.Name, p); } });
            foreach(var key in keys)
            {
                var propValue = tPropDic[key].GetValue(t, null);
                sPropDic[columnMap[key]].SetValue(s, propValue, null);
            }
        }
        /// 
        /// 将s中的各个对于的属性值赋值到t中相应的属性
        /// 
        /// 目标对象
        /// 原对象
        /// 以T中的属性名为键,S中的属性名为值的字典
        public static void CopyProp(S s,T t , Dictionary columnMap)
        {
                Type typeT = typeof(T);
                Type typeS = typeof(S);
                var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
                var sPropDic = new Dictionary();
                var keys = columnMap.Keys;
                var values = columnMap.Values;
                //遍历S的所有属性,将符合修改的存入字典中 
                sProps.ForEach(p => { if (values.Contains(p.Name)) { sPropDic.Add(p.Name, p); } });
                var tProps = typeT.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
                var tPropDic = new Dictionary();
                //遍历S的所有属性,将符合修改的存入字典中 
                tProps.ForEach(p => { if (keys.Contains(p.Name)) { tPropDic.Add(p.Name, p); } });
                foreach (var key in keys)
                {
                    var propValue = sPropDic[columnMap[key]].GetValue(s, null);
                    tPropDic[key].SetValue(t, propValue, null);
                }
        }
        /// 
        /// 将t中的各个对于的属性值赋值到s中相应的属性
        /// 
        /// 原对象
        /// 目标对象
        /// 以T中的属性名为键,S中的属性名为值的字典
        public static void CopyProp(T t, S s,List propNames)
        {
            Type typeT = typeof(T);
            Type typeS = typeof(S);
            var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
            var sPropDic = new Dictionary();
           
            //遍历S的所有属性,将符合修改的存入字典中 
            sProps.ForEach(p => { if (propNames.Contains(p.Name)) { sPropDic.Add(p.Name, p); } });
            var tProps = typeT.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
            var tPropDic = new Dictionary();
            //遍历S的所有属性,将符合修改的存入字典中 
            tProps.ForEach(p => { if (propNames.Contains(p.Name)) { tPropDic.Add(p.Name, p); } });
            foreach (var propName in propNames)
            {
                var propValue = tPropDic[propName].GetValue(t, null);
                sPropDic[propName].SetValue(s, propValue, null);
            }
        }
    }
}