Определите, какое поле '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;
  };
}

person kyrre    schedule 31.08.2017    source источник


Ответы (1)


https://developers.google.com/protocol-buffers/docs/reference/csharp-generated#oneof предполагает, что TypeOneofCase сообщит вам, что установлено:

Oneof Fields

Каждое поле внутри 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 со строковым или байтовым типом значение NULL. Установка для поля типа сообщения значения null эквивалентна вызову метода Clear, специфичного для oneof.

person mjwills    schedule 31.08.2017
comment
›В противном случае выборка свойства вернет значение по умолчанию для типа свойства - одновременно может быть установлен только один член oneof. Это ужасно! Значение по умолчанию и не установленное - не одно и то же! По сути, это делает реализацию C # бесполезной. - person Isen Ng; 22.11.2018
comment
@IsenGrim Но какая альтернатива (т.е. как бы вы ее построили в противном случае)? ImageUrl - это string, поэтому он принципиально должен возвращать что-то, что на самом деле является string - он не может возвращать что-то еще. Ключевой бит здесь - прочитать свойство AvatarCase, прежде чем решать, читать ли ImageUrl или ImageData. - person mjwills; 22.11.2018