优快云广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记
同一种类型的两个对象赋值,用反射。避免了一直点属性操作的麻烦.
下面是帮助类代码:
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);
}