确定在C#中设置了哪个'oneof'proto3字段

kyr*_*rre 2 c# protocol-buffers proto3

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

message Event {
  oneof type {
    Connection connection = 1;
    StatusReply reply = 2;
    Error error = 3;
    End end = 4;
    Empty empty = 5;
  };
}
Run Code Online (Sandbox Code Playgroud)

mjw*_*lls 6

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;
}
Run Code Online (Sandbox Code Playgroud)

编译器将生成这些公共成员:

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; }
Run Code Online (Sandbox Code Playgroud)

如果属性是当前的"case",则获取该属性将返回为该属性设置的值.否则,获取属性将返回属性类型的默认值 - 一次只能设置oneof的一个成员.

设置oneof的任何组成属性将改变oneof的报告"case".与常规奇异字段一样,您不能将字符串或字节类型的oneof字段设置为空值.将消息类型字段设置为null等同于调用oneof特定的Clear方法.

  • > 否则,获取属性将返回属性类型的默认值 - 一次只能设置 oneof 的一个成员。这太糟糕了!默认值和不设置是不一样的!这本质上使得 C# 实现毫无用处。 (2认同)