对于以下协议缓冲区消息(proto3),如何确定设置了哪种类型?似乎没有" has_reply"与生成的C ++版本的情况一样。
message Event {
oneof type {
Connection connection = 1;
StatusReply reply = 2;
Error error = 3;
End end = 4;
Empty empty = 5;
};
}
答案 0 :(得分:5)
https://developers.google.com/protocol-buffers/docs/reference/csharp-generated#oneof建议TypeOneofCase
会告诉您设置了哪个:
Oneof Fields
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; }
如果属性是当前的" case",则获取该属性将是 返回为该属性设置的值。否则,抓取 property将仅返回属性类型的默认值 一个人中的一个成员可以一次设置。
设置oneof的任何组成属性将更改报告的内容 "壳体"一个人的。与常规奇异场一样,您无法设置 一个字段,字符串或字节类型为空值。设置一个 message-type字段为null等效于调用oneof-specific 清晰的方法。