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;
}