C 反射呼叫拓展類方法

2022-09-19 09:06:07 字數 2395 閱讀 2064

今天封裝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...