Как создать экземпляр сообщения protobuf с заданным дескриптором MessageDescriptor (в dotnet / C #) - PullRequest
0 голосов
/ 17 декабря 2018

Контекст: консольное приложение C # / dotnet с использованием Google.Protobuf 3.6.1

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

Один из способов сделать это:

IMessage message = (IMessage)Activator.CreateInstance(messageDescriptor.ClrType);

И отсюда появляется поддержка для манипулирования объектами сообщений во время выполнения, например,

FieldDescriptor fieldDescriptor = messageDescriptor.Fields[0];
fieldDescriptor.Accessor.SetValue(message, 123)

Быстрый поиск предполагает, что CreateInstance(Тип) не так эффективен, как время компиляции new Foo(), поэтому мне было интересно, есть ли встроенная поддержка, которую мне не хватает, например, я надеялся на что-то вроде:

var msg = messageDescriptor.CreateMessage()

или

var msg = MessageBuilder.Create(messageDescriptor)

Activator.CreateInstance будет достаточно для моих нужд (то есть, более медленная производительность не является существенной проблемой в моем конкретном приложении / контексте), но я подумал, не упущен ли лучший / рекомендуемый подход.

1 Ответ

0 голосов
/ 17 декабря 2018

К сожалению, нет, насколько я вижу на данный момент.

Внутренне (например, в JsonParser) мы называем messageDescriptor.Parser.CreateTemplate(), но CreateTemplate() является внутренним методом.

Полагаю, вы могли бы позвонить:

var message = messageDescriptor.Parser.ParseFrom(ByteString.Empty);

Это позволило бы избежать отражения, и я вполне уверен, что это сработает, но это довольно уродливо.Стоит рассмотреть в качестве альтернативы ...

...