c#:打印空 protobuf 消息的所有字段
c#: print all fields of an empty protobuf message
我正在尝试为 gui 打印一条空的 protobuf 消息,让用户填写该消息。
由于我的 protobuf 消息是嵌套的,为每条消息声明一个描述符是不切实际的。
我想将 protobuf 消息结构显示为 json 或树视图。
有没有办法从消息实例中获取描述符?
即我怎样才能得到
//this:
descriptor = FATHER.Father.Descriptor;
//from:
FATHER.Father message = new FATHER.Father();
您可以使用反射在 class 上找到静态属性。
如果我对文档的理解正确,每种消息类型在名为 Descriptor
.
的静态 属性 中都有一个 MessageDescriptor
此代码将尝试在传递给它的任何对象上找到 属性。
public MessageDescriptor GetDescriptorOfMessageObject(object message) {
if(message == null) throw new ArgumentNullException(nameof(message));
var typ = message.GetType();
var descField = typ.GetProperty("Descriptor", BindingFlags.Public|BindingFlags.Static);
if(descField == null)
throw new Exception($"Cannot locate descriptor on message of type {typ.FullName}");
if(descField.PropertyType != typeof(MessageDescriptor))
throw new Exception($"Field 'Descriptor' on type {typ.FullName} is not a MessageDescriptor");
var desc = descField.GetValue(null) as MessageDescriptor;
return desc;
}
我正在尝试为 gui 打印一条空的 protobuf 消息,让用户填写该消息。 由于我的 protobuf 消息是嵌套的,为每条消息声明一个描述符是不切实际的。
我想将 protobuf 消息结构显示为 json 或树视图。 有没有办法从消息实例中获取描述符? 即我怎样才能得到
//this:
descriptor = FATHER.Father.Descriptor;
//from:
FATHER.Father message = new FATHER.Father();
您可以使用反射在 class 上找到静态属性。
如果我对文档的理解正确,每种消息类型在名为 Descriptor
.
MessageDescriptor
此代码将尝试在传递给它的任何对象上找到 属性。
public MessageDescriptor GetDescriptorOfMessageObject(object message) {
if(message == null) throw new ArgumentNullException(nameof(message));
var typ = message.GetType();
var descField = typ.GetProperty("Descriptor", BindingFlags.Public|BindingFlags.Static);
if(descField == null)
throw new Exception($"Cannot locate descriptor on message of type {typ.FullName}");
if(descField.PropertyType != typeof(MessageDescriptor))
throw new Exception($"Field 'Descriptor' on type {typ.FullName} is not a MessageDescriptor");
var desc = descField.GetValue(null) as MessageDescriptor;
return desc;
}