【问题标题】:How to determine at runtime the name of the oneof field that is set?如何在运行时确定设置的 oneof 字段的名称?
【发布时间】:2021-12-07 21:37:32
【问题描述】:

使用protobuf-net,而不是遍历每个ShouldSerialize*(),我如何确定设置了哪个oneof?我看到 ShouldSerialize*() 在内部使用了这个 __pbn__message.Is(7) 但私有属性不可访问,我也不知道如何获取最大字段数?

尽量避免迭代每个 ShouldSerialize*() 方法,因为当添加新类型时,我们也需要更新迭代。

类似的问题,但使用 Google 的 Nuget 包解决了: Getting all field names from a protocol buffer?

【问题讨论】:

    标签: protobuf-net


    【解决方案1】:

    假设您使用的是模式解析工具:有一个选项可以发出一个枚举和访问器来准确地告诉您这一点。只需启用此选项,然后:完成。具体如何访问此选项取决于您运行工具的方式(在命令行、构建时生成器、通过网站等)。

    如果您是手动编写的:请检查已区分联合字段上的 .Discriminator 访问器。从昨天的答案中复制和粘贴:添加的所有选项都相当于以下内容(但对于您的上下文):

    public ContentOneofCase ContentCase => (ContentOneofCase)__pbn__Content.Discriminator;
    
    public enum ContentOneofCase
    {
        None = 0,
        Foo = 1,
        Bar = 2,
        Blap = 3,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-07
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多