您的位置:首页 > 编程语言 > C#

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

2018-02-02 15:54 1466 查看
假设,我们有两个类:

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

后续修改:

可以添加自定义属性,设置自定属性的脚本,即使属性名称不一致,也可以通过反射进行赋值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐