共享一个用反射实现的任意实体类之间的数据“复制或合并”代码(十行以内),控制非常的灵活~~~

wtoeb 2015-12-27 10:38:07
加精
1、说明:
string[] reqItems是需要复制的列属性,可以在调用的时候就指定复制哪些字段,而略过其它不需要复制的字段。
bool create指定是复制,还是新建?
2、用途:
(1)用于相同实体类之间的数据复制。
(2)用于不同实体类之间的数据复制。
(3)用于多个实体类合成为新的实体类。
3、示例:
下面 是我们原来更新数据时的代码,是不是很麻烦?
var row = rows.FirstOrDefault();
if (row == null) continue;
row.StockCode = webItem.StockCode;
row.StockMarket = webItem.StockMarket;
row.StockName = webItem.StockName;
row.PriceClose = webItem.PriceClose;
row.RatioChange = webItem.RatioChange;
row.DateTimeUpdate = DateTime.Now;
row.FlagStatus = 0;
row.Para1_RatioAmp = webItem.Para1_RatioAmp;
row.Para1_RatioChange = webItem.Para1_RatioChange;
row.Para1_PriceHigh = webItem.Para1_PriceHigh;
row.Para1_PriceLast = webItem.Para1_PriceLast;
row.Para1_PriceLower = webItem.Para1_PriceLower;
row.Para1_PriceClose = webItem.Para1_PriceClose;
row.Para1_PriceOpen = webItem.Para1_PriceOpen;
row.Para1_TradeAmount = webItem.Para1_TradeAmount;
row.Para1_TradeVolume = webItem.Para1_TradeVolume;
row.Para1_RatioTurnOver = webItem.Para1_RatioTurnOver;
row.Para2_RatioAmp = webItem.Para2_RatioAmp;
row.Para2_RatioChange = webItem.Para2_RatioChange;
row.Para2_PriceHigh = webItem.Para2_PriceHigh;
row.Para2_PriceLast = webItem.Para2_PriceLast;
row.Para2_PriceLower = webItem.Para2_PriceLower;
row.Para2_PriceClose = webItem.Para2_PriceClose;
row.Para2_PriceOpen = webItem.Para2_PriceOpen;
row.Para2_TradeAmount = webItem.Para2_TradeAmount;
row.Para2_TradeVolume = webItem.Para2_TradeVolume;
row.Para2_RatioTurnOver = webItem.Para2_RatioTurnOver;
row.Para3_RatioAmp = webItem.Para3_RatioAmp;
row.Para3_RatioChange = webItem.Para3_RatioChange;
row.Para3_PriceHigh = webItem.Para3_PriceHigh;
row.Para3_PriceLast = webItem.Para3_PriceLast;
row.Para3_PriceLower = webItem.Para3_PriceLower;
row.Para3_PriceClose = webItem.Para3_PriceClose;
row.Para3_PriceOpen = webItem.Para3_PriceOpen;
row.Para3_TradeAmount = webItem.Para3_TradeAmount;
row.Para3_TradeVolume = webItem.Para3_TradeVolume;
row.Para3_RatioTurnOver = webItem.Para3_RatioTurnOver;
row.Para4_RatioAmp = webItem.Para4_RatioAmp;
row.Para4_RatioChange = webItem.Para4_RatioChange;
row.Para4_PriceHigh = webItem.Para4_PriceHigh;
row.Para4_PriceLast = webItem.Para4_PriceLast;
row.Para4_PriceLower = webItem.Para4_PriceLower;
row.Para4_PriceClose = webItem.Para4_PriceClose;
row.Para4_PriceOpen = webItem.Para4_PriceOpen;
row.Para4_TradeAmount = webItem.Para4_TradeAmount;
row.Para4_TradeVolume = webItem.Para4_TradeVolume;
row.Para4_RatioTurnOver = webItem.Para4_RatioTurnOver;

现在用一个通用的方法就避免了需要手工去写那些代码。
        private void UpdateMarket<TSource, TTarget>(TSource s, TTarget t, string[] reqItems = null, bool create = false)
where TSource : new()
where TTarget : new()
{
foreach (var p in t.GetType().GetProperties()) // 以目标表为参照对象
{
// 复制到本地变量
var p1 = p;
// PkId 字段略过,Insert时略过Update,Update时略过Create。
if (p1.Name.CompareExt("PkId") || (create ? p1.Name.CompareExt("DateTimeUpdate") : p1.Name.CompareExt("DateTimeCreate"))) continue;
if (reqItems != null && reqItems.All(w => w != p1.Name)) continue;
var s1 = s.GetType().GetField(p1.Name); // 找到来源实体类的字段信息
if (s1 != null)
{
p1.SetValue(t, s1.GetValue(null), null);
}
else
{
var s2 = s.GetType().GetProperty(p1.Name);
if (s2 == null) continue;
p1.SetValue(t, s2.GetValue(s, null), null);
}
}
}
...全文
3515 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_35615276 2016-07-15
  • 打赏
  • 举报
回复
貌似 你那个遍历条件也找不到字段啊!
   var s1 = s.GetType().GetField(p1.Name); // 找到来源实体类的字段信息
                if (s1 != null)
                {
                    p1.SetValue(t, s1.GetValue(null), null);
                }
,请问这里的意义是??内存多了没地方用啊
baidu_35615276 2016-07-15
  • 打赏
  • 举报
回复
好像要考虑数据的类型不同的情况?这种function咋连异常都不捕捉
gongchihao1 2016-01-08
  • 打赏
  • 举报
回复
mao77811 2015-12-30
  • 打赏
  • 举报
回复
http://www.sdchengyiwood.com辐射松集成材
mao77811 2015-12-30
  • 打赏
  • 举报
回复
http://www.sdchengyiwood.co辐射松集成材
joyhen 2015-12-29
  • 打赏
  • 举报
回复
可以用ExpandoObject和ConcurrentDictionary写一个
  • 打赏
  • 举报
回复
不错.....
Lee_Y_K 2015-12-28
  • 打赏
  • 举报
回复
刚刚写了一篇。http://bbs.csdn.net/topics/391883640
Lee_Y_K 2015-12-28
  • 打赏
  • 举报
回复
用Expression表达式树会更快,接近直接赋值的性能。
kensouterry1 2015-12-27
  • 打赏
  • 举报
回复
也未尝不可,写两套方法:第一个反射看效果,第二个model赋值提高性能;还可以向用户多收取维护费用,妙哉妙哉!
wtoeb 2015-12-27
  • 打赏
  • 举报
回复
我们小散考虑的是效率,等把项目快速的完成了,你再用那个复杂代码的方式去完善项目,不就用了么?
cheng2005 2015-12-27
  • 打赏
  • 举报
回复
真的要在基础框架中使用的话,性能是不得不考虑的事情。
kensouterry1 2015-12-27
  • 打赏
  • 举报
回复
数据量大的话,调用起来是方便,但性能有点点卡
tcmakebest 2015-12-27
  • 打赏
  • 举报
回复
这个挺好用的,学过反射的应该都会了,只是用不着泛型的语法和 where 条件.
  • 打赏
  • 举报
回复
固定的几个copy方法都会有的,不是所有的copy方法都不写。但是如果它比较繁琐,首先要考虑到程序设计者不懂得面向对象的机制才造成的。这种问题的后果才比较严重,不是用一堆低效的方式可以弥补的。
crystal_lz 2015-12-27
  • 打赏
  • 举报
回复
通常大量的这类代码 都是直接生成的。。。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧