代码之家  ›  专栏  ›  技术社区  ›  redcalx

如何创建给定messagedescriptor的protobuf消息实例(在dotnet/c中)

  •  2
  • redcalx  · 技术社区  · 5 年前

    上下文:使用google.protobuf 3.6.1的c/dotnet控制台应用程序

    我想实例化一个新的protobuf消息对象,只提供一个messagedescriptor,也就是说,消息类型在编译时是未知的。

    一种方法是:

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

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

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

    快速搜索表明,createInstance(type)的效率不如编译时。 new Foo() ,所以我想知道是否有内置的支持我是失踪的,例如,我希望:

    var msg = messageDescriptor.CreateMessage()
    

    var msg = MessageBuilder.Create(messageDescriptor)
    

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

    1 回复  |  直到 5 年前
        1
  •  2
  •   Jon Skeet    5 年前

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

    内部(例如 JsonParser )我们打电话来 messageDescriptor.Parser.CreateTemplate() 但是 CreateTemplate() 是内部方法。

    我想你 能够 呼叫:

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

    这样可以避免反射,我很有信心它会起作用,但它相当难看。值得考虑作为一种选择…