如何在运行时确定设置的 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 字段的名称?的主要内容,如果未能解决你的问题,请参考以下文章
用于非 protobuf 类的 protobuf `oneof` 功能的 C++ 实现
生成 Spring 代码时如何将 OpenAPI“oneOf”属性与 openapi-generator-maven-plugin 一起使用