C# c protobuf反射用法

C# c protobuf反射用法,c#,protocol-buffers,C#,Protocol Buffers,我正在使用官方的c protobufnot Protobuf网络。它是否支持根据其类型创建消息对象 典型的反序列化如下所示: MyProtoMessageClass obj = MyProtoMessageClass.Parser.ParseFrom(byteArray); 但是如何根据 "MyProtoMessageClass" 或者Google.Protobuf.Reflection.MessageDescriptor的obj,它是 ? 更新 假设我们得到了这个原型定义: syntax

我正在使用官方的c protobufnot Protobuf网络。它是否支持根据其类型创建消息对象

典型的反序列化如下所示:

MyProtoMessageClass obj = MyProtoMessageClass.Parser.ParseFrom(byteArray);
但是如何根据

"MyProtoMessageClass"
或者Google.Protobuf.Reflection.MessageDescriptor的obj,它是

?

更新


假设我们得到了这个原型定义:

syntax = "proto3";
package tutorial;
option csharp_namespace = "T1.Models";

message Person {
    int32 id = 1;
    string name = 2;
}
通过编译这个proto文件,我们得到一个名为Person的类,它实现了Google.Protobuf.IMessage。 此接口包含属性MessageDescriptor描述符{get;},该描述符由类Person实现,并返回MessageDescriptor类型的公共静态属性

MessageDescriptor包含一个名为Parser的公共静态属性,我们可以调用它的ParseFrombyteArray

守则:

var typ = Assembly.GetExecutingAssembly().GetTypes().First(t => t.Name == "Person"); //get the type using the string we got, here it is 'Person'
var descriptor = (MessageDescriptor)typ.GetProperty("Descriptor", BindingFlags.Public | BindingFlags.Static).GetValue(null, null); // get the static property Descriptor
var person = descriptor.Parser.ParseFrom(byteArray); // parse the byte array to Person

谢谢,我发现这可以满足我的要求:Google.Protobuf.IMessage msg=newmyprotomessageclass;msg.Descriptor.Parser.ParseFrombyte;msg对象仅用于获取描述符对象,由于所有msg类型都是IMessage,因此我可以将它们放入container@jean,实际上你可以有一个字典,里面装满了静态的MyProtoMessageClass.Descriptor.Parser,如果是这样的话,请告诉我,以便我更新答案以帮助其他人。描述符是静态的,不需要新建实例。是的,我有一个字典,当我的应用程序从tcp连接接收数据时,我会得到一个int变量“cmd”和一个字节[]“data”。我需要根据“cmd”值创建proto message obj,以确定我需要创建哪个消息类obj,并将数据传递给创建函数。目前我使用DictionaryOf当然当我使用obj时,我会将它向下转换到正确的子类型。这样做可以避免重复解析器code@jean,您能否显示用于填充dict的代码?
syntax = "proto3";
package tutorial;
option csharp_namespace = "T1.Models";

message Person {
    int32 id = 1;
    string name = 2;
}
var typ = Assembly.GetExecutingAssembly().GetTypes().First(t => t.Name == "Person"); //get the type using the string we got, here it is 'Person'
var descriptor = (MessageDescriptor)typ.GetProperty("Descriptor", BindingFlags.Public | BindingFlags.Static).GetValue(null, null); // get the static property Descriptor
var person = descriptor.Parser.ParseFrom(byteArray); // parse the byte array to Person