如何在给定MessagedScriptor(在dotnet / c#中)创建Protobuf消息实例



上下文:使用Google.protobuf 3.6.1

c#/dotnet控制台应用

我想仅给定一个MessagedScriptor实例化新的Protobuf消息对象,即,在编译时不知道消息类型。

一种方法是:

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足以满足我的需求(即,在我的特定应用程序/上下文中,较慢的性能并不是一个重要的问题),但是我想知道我是否缺少更好/推荐的方法。

不幸的是,据我目前所能看到的。

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

我想你可以呼叫:

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

这将避免反射,我非常有信心它会起作用,但这很丑陋。值得考虑作为替代方案...

最新更新