c#: вывести все поля пустого сообщения protobuf - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь напечатать пустое сообщение protobuf для gui, чтобы позволить пользователю заполнить это сообщение. так как мои сообщения protobuf являются вложенными, нецелесообразно объявлять дескриптор для каждого сообщения.

Я хочу показать структуру сообщения protobuf как json или в виде дерева. Есть ли способ получить дескриптор из экземпляра сообщения? т.е. как я могу получить

    //this:
    descriptor = FATHER.Father.Descriptor;
    //from:
    FATHER.Father message = new FATHER.Father();

1 Ответ

0 голосов
/ 03 февраля 2020

Вы можете найти свойства c класса, используя отражение. Если я правильно понимаю документацию, каждый тип сообщения имеет MessageDescriptor в свойстве stati c с именем Descriptor.

. Этот код попытается найти это свойство в любом переданном ему объекте.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...