Определите, какое поле 'oneof' proto3 установлено в C#
Для следующего сообщения Protocol Buffer (proto3), как определить, какой тип установлен? Кажется, не существует метода has_reply, как в случае сгенерированной версии C++.
message Event {
oneof type {
Connection connection = 1;
StatusReply reply = 2;
Error error = 3;
End end = 4;
Empty empty = 5;
};
}
1 ответ
https://developers.google.com/protocol-buffers/docs/reference/csharp-generated предполагает, что TypeOneofCase
скажет вам, что установлено:
Одно из полей
Каждое поле в 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 со строковым или байтовым типом нулевое значение. Установка поля типа сообщения в null эквивалентно вызову метода очистки одного из них.