添加C# ProtoGen List set方法 ,使用反射设置属性的值
2018-02-02 15:54
1466 查看
假设,我们有两个类:
class1 类1 为我们自定义的类
class2 类2 为ProtoGen 编译生成类
假设class1中有属性:
class2 由ProtoGen根据.proto文件生成也包含intList属性:
现在我们想做一个工具,作用是,通过反射,将class1和class2中拥有相同名称属性,将class1的值赋值给class2:
由于class2生成list只有get方法,而没有set方法:
所以是无法使用SetValue的,而我又没有找到关于list赋值的方法,只能修改ProtoGen,使其list生成set方法。
修改步骤:
1.在ProtoGen工具中找到csharp.xslt文件
2.打开文件,搜索list关键字(第一个就是)
3.修改文件,修改结果:
之后解析文件后生成脚本:
Conversion 方法就可以使用了,正确赋值,解放双手,不用一个一个属性去进行赋值了。
后续修改:
可以添加自定义属性,设置自定属性的脚本,即使属性名称不一致,也可以通过反射进行赋值
class1 类1 为我们自定义的类
class2 类2 为ProtoGen 编译生成类
假设class1中有属性:
private List<int> intList= new List<int>();
class2 由ProtoGen根据.proto文件生成也包含intList属性:
现在我们想做一个工具,作用是,通过反射,将class1和class2中拥有相同名称属性,将class1的值赋值给class2:
//转换方法 T1 为目标类 T2 为原类 带有数据的类 public static T1 Conversion<T1, T2>(T2 source) where T1 : class where T2 : class { //获取T1的Type Type t1Type = typeof(T1); //生成实例 object t1Result = Activator.CreateInstance(t1Type, null); //获取T1的属性 PropertyInfo[] ResultProPerts = t1Type.GetProperties(); //获取T2的type Type t2Type = source.GetType(); //获取T2的属性 PropertyInfo[] SourceProperts = t2Type.GetProperties(); //比较结果 for (int i = 0; i < SourceProperts.Length; i++) { for (int j = 0; j < ResultProPerts.Length; j++) { //如果相同 if (ResultProPerts[j].Name == SourceProperts[i].Name) //设置值 ResultProPerts[j].SetValue(t1Result, SourceProperts[i].GetValue(source)); } } return (T1)t1Result; }
由于class2生成list只有get方法,而没有set方法:
所以是无法使用SetValue的,而我又没有找到关于list赋值的方法,只能修改ProtoGen,使其list生成set方法。
修改步骤:
1.在ProtoGen工具中找到csharp.xslt文件
2.打开文件,搜索list关键字(第一个就是)
3.修改文件,修改结果:
之后解析文件后生成脚本:
Conversion 方法就可以使用了,正确赋值,解放双手,不用一个一个属性去进行赋值了。
后续修改:
可以添加自定义属性,设置自定属性的脚本,即使属性名称不一致,也可以通过反射进行赋值
相关文章推荐
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- 利用反射原理用get/set方法设置属性(也可用clone,但如果有特殊处理的东西,这个好用)
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- [java]反射机制给属性使用set方法构造对象
- 如何在C#中使用get及set方法定义属性
- java将属性设置为私有,在给其添加get/set方法和直接把属性设置成public有什么区别
- 【封装】java中为什么要将属性进行私有化,又使用set和get方法来设置和获取属性呢?
- C# 使用反射设置某个对象的属性或读取某个对象的属性
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- [java]反射机制给属性使用set方法构造对象
- C#反射实例——获取及设置对象属性,运行对象方法
- C#反射新建类实例和调用类方法及属性帮助类 以及获取或设置对象属性中字段值帮助类
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Java反射:根据属性名得到其Set方法设置它的值
- 使用xml给类、方法、属性添加智能感知功能