5

对于以下协议缓冲区消息(proto3),我如何确定设置了哪种类型?似乎没有像生成的 C++ 版本那样的“has_reply”方法。

message Event {
  oneof type {
    Connection connection = 1;
    StatusReply reply = 2;
    Error error = 3;
    End end = 4;
    Empty empty = 5;
  };
}
4

1 回答 1

8

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 方法。

于 2017-08-31T10:40:46.343 回答