初始化 Google Protobuf RepeatedField 集合

sbp*_*sbp 7 .net c# protocol-buffers

当您尝试初始化已生成的 Google Protobuf 消息类型的重复字段成员(属性)时,您不能使用 setter,因为它们是只读的。

如何初始化 google Protobuf 消息的 RepeatedField 集合?

Pet*_*art 9

虽然它的语法有点奇怪,但您实际上可以像这样集合初始值设定项中使用集合RepeatedField

var promotions = new List<Promotion>(); 
// code to populate promotions 
var price = new Price() { Promotions = { promotions } };
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为RepeatedField定义了一个自定义集合初始值设定项(为此Add需要重载IEnumerable<T>)。

我想这是一种解决方法,因此可以readonly在消息中声明这些字段,但仍然可以使用集合初始值设定项。

  • 也可以在内部 `{ }` 初始化器中使用 LINQ 查询。 (2认同)

sbp*_*sbp 4

repeated从文件生成的集合属性/成员.proto是只读的。一旦您新建了生成的 protobuf 类型的实例,它们就会被初始化。由于它是只读集合,因此您无法将其设置为另一个实例,但可以将元素添加到已创建的实例中。

您需要使用 Google Protobuf .net 库的扩展方法(对我来说这并不直观,因为在撰写本文时我没有在 VS 2019 中获得 IntelliSense 支持)。

例如,如果您的 protobuf 生成的类型恰好Price有重复的字段/集合促销,repeated Promotion promotions = <some int>那么您会这样做

var price = new Price(); //just placeholder for already generated message
//other code
var promotions = new List<Promotion>(); //List is just an example
//code to populate promotions 
price.Promotions.Add(promotions);
Run Code Online (Sandbox Code Playgroud)

官方参考链接