通过表达式目录树拼装lambda表达式,来实现两个类型的复制
时间:2019-11-07
本文章向大家介绍通过表达式目录树拼装lambda表达式,来实现两个类型的复制,主要包括通过表达式目录树拼装lambda表达式,来实现两个类型的复制使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、下面的方法实现两个类型间的值复制
/// <summary> /// 交换两个类型的属性(复制) /// </summary> /// <typeparam name="Tin"></typeparam> /// <typeparam name="Tout"></typeparam> public static class ExpressionCopy<Tin, Tout> { public static Tout Excharnge(Tin tin) { ParameterExpression experssionin = Expression.Parameter(typeof(Tin), "tModel");//创建实例 List<MemberBinding> memberList = new List<MemberBinding>();//通过绑定用的 foreach (var item in typeof(Tout).GetFields())//遍历所有的共有字段 { FieldInfo field = typeof(Tin).GetField(item.Name.GetPropertyRemark(typeof(Tout), 1)); if (field != null) { MemberExpression member = Expression.Field(experssionin, field); MemberBinding binding = Expression.Bind(item, member); memberList.Add(binding); } } foreach (var item in typeof(Tout).GetProperties())//遍历属性 { PropertyInfo pro = typeof(Tin).GetProperty(item.Name.GetPropertyRemark(typeof(Tout), 2));//判断属性是否存在 if (pro != null) { MemberExpression proper = Expression.Property(experssionin, pro); MemberBinding binding = Expression.Bind(item, proper); memberList.Add(binding); } } MemberInitExpression init = Expression.MemberInit(Expression.New(typeof(Tout)), memberList.ToArray());//初始化绑定新成员 Expression<Func<Tin, Tout>> lambda = Expression.Lambda<Func<Tin, Tout>>(init, new ParameterExpression[] { experssionin }); return lambda.Compile().Invoke(tin); } }
二、声明特性为了防止当要复制的属性字段不一致
/// <summary> /// 特性 /// </summary> public class GetRemarkAttribute : Attribute { public GetRemarkAttribute(string name) { this._remark = name; } private string _remark; public string GetRemark() { return _remark; } }
三、通过反射为string类型添加一个扩展方法,来获取特性的值
1 public static class GetRemark 2 { 3 /// <summary> 4 /// 通过反射获得特性 5 /// </summary> 6 /// <param name="values">字段属性名称</param> 7 /// <param name="type">类型</param> 8 /// <param name="parameter">参数1为字段2为属性</param> 9 /// <returns></returns> 10 public static string GetPropertyRemark(this string values, Type type, int parameter) 11 { 12 if (parameter == 1) 13 { 14 FieldInfo propperty = type.GetField(values); 15 16 if (propperty.IsDefined(typeof(GetRemarkAttribute))) 17 { 18 GetRemarkAttribute remark = (GetRemarkAttribute)propperty.GetCustomAttribute(typeof(GetRemarkAttribute)); 19 return remark.GetRemark(); 20 } 21 22 } 23 else 24 { 25 PropertyInfo propperty = type.GetProperty(values); 26 27 if (propperty.IsDefined(typeof(GetRemarkAttribute))) 28 { 29 GetRemarkAttribute remark = (GetRemarkAttribute)propperty.GetCustomAttribute(typeof(GetRemarkAttribute)); 30 return remark.GetRemark(); 31 } 32 33 } 34 return values; 35 36 } 37 }
四、下面就是实际操作调用
1 public class OldPersoninfo 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 public string Type { get; set; } 6 public OldPersoninfo() 7 { 8 Id = 2; 9 Name = "测试"; 10 Type = "非常类额"; 11 } 12 } 13 public class NewPersoninfo 14 { 15 public int Id { get; set; } 16 // [GetRemark("Name")] 17 public string newName { get; set; } 18 //[GetRemark("Type")] 19 public string newType { get; set; } 20 } 21 22 23 private void test_Load(object sender, EventArgs e) 24 { 25 OldPersoninfo old = new OldPersoninfo(); 26 NewPersoninfo newPersoninfo = ExpressionCopy<OldPersoninfo, NewPersoninfo>.Excharnge(old); 27 MessageBox.Show(newPersoninfo.newType); 28 }
原文地址:https://www.cnblogs.com/xiaojunwu/p/11811829.html
- 大数据和云计算技术周报:NoSQL特辑
- 常用业务接口界面化 in python flask
- 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
- 区块链推动支付革命
- MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
- nohup命令
- 跨浏览器的剪贴板访问解决方案
- 装逼必备:大型分布式网站术语分析
- 年前爆炸一波!小程序视频功能来了!
- ubuntu13.04环境hadoop1.2.1单机模式安装
- silverlight:telerik RadControls中RadGridView的一个Bug及解决办法
- scope引起的问题
- JS正则表达式常用函数汇总
- 修改(同步)linux时间
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法