如何在运行时确定设置的 oneof 字段的名称?

Posted

技术标签:

【中文标题】如何在运行时确定设置的 oneof 字段的名称?【英文标题】:How to determine at runtime the name of the oneof field that is set? 【发布时间】: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?

【问题讨论】:

【参考方案1】:

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

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

public ContentOneofCase ContentCase => (ContentOneofCase)__pbn__Content.Discriminator;

public enum ContentOneofCase

    None = 0,
    Foo = 1,
    Bar = 2,
    Blap = 3,

【讨论】:

以上是关于如何在运行时确定设置的 oneof 字段的名称?的主要内容,如果未能解决你的问题,请参考以下文章

arcgis 如何改变字段的别名

Protobuf-net - 如何使用 oneof

ArcGIS中的字段名称可以修改吗?

用于非 protobuf 类的 protobuf `oneof` 功能的 C++ 实现

如何在运行时更改 .exe 的名称

生成 Spring 代码时如何将 OpenAPI“oneOf”属性与 openapi-generator-maven-plugin 一起使用