Определите, какое поле '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 эквивалентно вызову метода очистки одного из них.

Другие вопросы по тегам