添加C# ProtoGen List set方法 ,使用反射设置属性的值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18192161/article/details/79240130

假设,我们有两个类:
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 方法就可以使用了,正确赋值,解放双手,不用一个一个属性去进行赋值了。

后续修改:
可以添加自定义属性,设置自定属性的脚本,即使属性名称不一致,也可以通过反射进行赋值

猜你喜欢

转载自blog.csdn.net/qq_18192161/article/details/79240130
今日推荐