假设,我们有两个类:
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 方法就可以使用了,正确赋值,解放双手,不用一个一个属性去进行赋值了。
后续修改:
可以添加自定义属性,设置自定属性的脚本,即使属性名称不一致,也可以通过反射进行赋值