今天封裝protobuf封包時候遇到乙個問題;
protobuf的反序列化方法mergefrom,是寫在擴充套件類裡的;c#拓展類
通過反射獲取不到這個方法,就沒法使用type來泛型封裝...
然而仔細一想,拓展類不也是類嗎,直接反射獲取拓展類方法好了;
在看google.protobuf原始碼,找到這個類;
這個mergefrom方法就是需要的;
那這個imessage介面怎麼辦;
所有自動生成的protobuf類都只自動繼承兩個介面;
所以傳需要序列化的類即可;
//接收到伺服器訊息;反序列化後執行相應路由方法
public void dispatchproto(int protoid, byte bytes)
"); return;
}
type prototype = protodic.getprototypebyprotoid(protoid);
logger.log($"protoid:;--typename:");
//列印傳輸獲得的位元組的utf-8編碼
printutf8code(bytes);
type tp = typeof(google.protobuf.messageextensions);
//反射獲取拓展類方法mergefrom
methodinfo method = reflecttool.getextentmethod(tp,"mergefrom", prototype, typeof(byte));
//反射建立例項,**方法
object obj = reflecttool.createinstance(prototype);
reflecttool.methodinvoke(method, obj, obj, bytes);
sevents.enqueue(new keyvaluepair(prototype, obj));
}
protodic儲存了protoid和對應的型別type;
reflecttool.getextentmethod——封裝了getmethod方法,為了能連續傳入多個引數,而不是傳type陣列;
reflecttool.methodinvoke——和上面目的一樣;
//獲取擴充套件方法
public static methodinfo getextentmethod(type extenttype, string methodname, params type funcparams)
public static object methodinvoke(methodinfo method, object obj, params object parameters)
//通過type建立例項,返回object
public static object createinstance(type reftype, params object objinitial)
is null");
}return res;
}
最後寫測試**:pb.broadcast結構為:
message broadcast
執行**:
pb.broadcast bo = new pb.broadcast();
bo.pid = 1;
bo.tp = 1;
bo.content = "perilla";
byte res = bo.tobytearray();
//列印位元組的utf-8編碼
stringbuilder strbuilder = new stringbuilder();
for (int i = 0; i < res.length; ++i)
logger.log(strbuilder.tostring());
pb.broadcast bo2 = new pb.broadcast();
bo2.mergefrom(res);
logger.logformat("====", bo2.pid, bo2.tp, bo2.content);
執行結果:
C 通過反射呼叫類及方法
反射有個典型的應用,就是選單的動態載入,原理就是通過反射呼叫某個窗體 類 下面演示python基礎教程 一下通過反射呼叫類及方法 1 新建乙個類,命名為 reflectionhelper,如下 region 建立物件例項 建立物件例項 物件型別 程式集名稱 命名空間 類名 public static...
C 通過反射呼叫類及方法
反射有個典型的應用,就是選單的動態載入,原理就是通過反射呼叫某個窗體 類 下面演示一下通過反射呼叫類及方法 1 新建乙個類,命名為 reflectionhelper,如下 region 建立物件例項 建立物件例項 物件型別 程式集名稱 命名空間 類名 public static t createin...
C 利用反射呼叫類下的方法
1.主窗體下的 namespace testreflection private void comboboxedit1 selectedindexchanged object sender,eventargs e 反射呼叫類中的方法 private void testmethod string me...