上下文:使用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);
这将避免反射,我非常有信心它会起作用,但这很丑陋。值得考虑作为替代方案...