同类型对象利用反射自动赋值

来源:互联网 发布:java 多线程适用于什么 编辑:程序博客网 时间:2024/05/14 03:43

同一种类型的两个对象赋值,用反射。避免了一直点属性操作的麻烦.

下面是帮助类代码:

 public class ObjectAssign    {        /// <summary>        /// 对象赋值        /// </summary>        /// <typeparam name="T"><peparam>        /// <param name="left">被赋值对象(等号左边的)</param>        /// <param name="right">赋值对象(等号右边的)</param>        /// <param name="id">不修改的字段,eg:Test.Assignment<tb_goods_class>(tt, t, new string[]{"id","productName"});</param>        public static void Assign<T>(T left, T right,string []attrs=null)        {            Type type = left.GetType();            List<PropertyInfo> pList = type.GetProperties().ToList();            for (int i = 0; i < pList.Count; i++)            {                //根据属性名获得指定的属性对象                PropertyInfo gc = type.GetProperty(pList[i].Name);                //设置属性的值                if (attrs != null&&attrs.Length>0)                {                    string attrName = pList[i].Name.ToLower();                    if (!attrs.Contains(attrName))                    {                        gc.SetValue(left, pList[i].GetValue(right, null), null);                    }                }                else                {                    gc.SetValue(left, pList[i].GetValue(right, null), null);                }            }        }    }

下面是使用方式,大家可以打个断点看看结果:

        private void btnStart_Click(object sender, EventArgs e)        {            Entity.Entities ee = new Entity.Entities();            tb_goods_class tt = ee.tb_goods_class.OrderByDescending(r => r.id).Take(1).FirstOrDefault();            tb_goods_class t = new tb_goods_class();            t.anotherName = DateTime.Now.ToString();            t.keywords = DateTime.Now.ToString();            t.id = 1;            //"id", "keywords" 不需要被赋值            ObjectAssign.Assign<tb_goods_class>(tt, t, new string[] { "id", "keywords" });            //任何字段都要被赋值            ObjectAssign.Assign<tb_goods_class>(tt, t, new string[] { });            ObjectAssign.Assign<tb_goods_class>(tt, t, null);            ObjectAssign.Assign<tb_goods_class>(tt, t);        }


0 0