首页 > 解决方案 > 如何在给定 MessageDescriptor 的情况下创建 protobuf Message 实例(在 dotnet / C# 中)

问题描述

上下文:使用 Google.Protobuf 3.6.1 的 C#/dotnet 控制台应用程序

我想实例化一个仅给定 MessageDescriptor 的新 protobuf 消息对象,即消息类型在编译时是未知的。

一种方法是:

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

从这里开始,似乎支持消息对象的运行时操作,例如

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

快速搜索表明 CreateInstance(Type) 的效率不如 compile time new Foo(),所以我想知道是否有我缺少的内置支持,例如我希望得到类似的东西:

var msg = messageDescriptor.CreateMessage()

或者

var msg = MessageBuilder.Create(messageDescriptor)

Activator.CreateInstance 足以满足我的需求(即,在我的特定应用程序/上下文中,较慢的性能不是一个重大问题),但我想知道我是否错过了更好/推荐的方法。

标签: c#.netprotocol-buffers

解决方案


不幸的是,据我目前所见,没有。

在内部(例如 in JsonParser)我们调用messageDescriptor.Parser.CreateTemplate(),但是CreateTemplate()是一个内部方法。

我想你可以打电话:

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

这样可以避免反射,我很有信心它会起作用,但它相当难看。值得考虑作为替代...


推荐阅读