新增C# ProtoGen List set方法 ,使用反射設定屬性的值
阿新 • • 發佈:2018-11-27
假設,我們有兩個類:
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 方法就可以使用了,正確賦值,解放雙手,不用一個一個屬性去進行賦值了。
後續修改:
可以新增自定義屬性,設定自定屬性的指令碼,即使屬性名稱不一致,也可以通過反射進行賦值