对于以下协议缓冲区消息(proto3),我如何确定设置了哪种类型?似乎没有像生成的 C++ 版本那样的“has_reply”方法。
message Event {
oneof type {
Connection connection = 1;
StatusReply reply = 2;
Error error = 3;
End end = 4;
Empty empty = 5;
};
}
对于以下协议缓冲区消息(proto3),我如何确定设置了哪种类型?似乎没有像生成的 C++ 版本那样的“has_reply”方法。
message Event {
oneof type {
Connection connection = 1;
StatusReply reply = 2;
Error error = 3;
End end = 4;
Empty empty = 5;
};
}
https://developers.google.com/protocol-buffers/docs/reference/csharp-generated#oneof建议TypeOneofCase
会告诉你设置的是:
一个字段
oneof 中的每个字段都有一个单独的属性,就像常规的单数字段一样。但是,编译器还会生成一个附加属性来确定枚举中的哪个字段已被设置,以及一个枚举和一个清除 oneof 的方法。例如,对于这个 oneof 字段定义
oneof avatar { string image_url = 1; bytes image_data = 2; }
编译器将生成这些公共成员:
enum AvatarOneofCase { None = 0, ImageUrl = 1, ImageData = 2 } public AvatarOneofCase AvatarCase { get; } public void ClearAvatar(); public string ImageUrl { get; set; } public ByteString ImageData { get; set; }
如果一个属性是当前的“案例”,获取该属性将返回为该属性设置的值。否则,获取属性将返回属性类型的默认值 - 一次只能设置 oneof 的一个成员。
设置 oneof 的任何组成属性将更改 oneof 报告的“案例”。与常规单数字段一样,您不能将字符串或字节类型的 oneof 字段设置为空值。将 message-type 字段设置为 null 等效于调用 oneof-specific Clear 方法。