1. 程式人生 > >新增C# ProtoGen List set方法 ,使用反射設定屬性的值

新增C# ProtoGen List set方法 ,使用反射設定屬性的值

假設,我們有兩個類:
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 方法就可以使用了,正確賦值,解放雙手,不用一個一個屬性去進行賦值了。

後續修改:
可以新增自定義屬性,設定自定屬性的指令碼,即使屬性名稱不一致,也可以通過反射進行賦值