同一种类型的两个对象赋值,用反射。避免了一直点属性操作的麻烦.
下面是帮助类代码:
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); }