sbp*_*sbp 7 .net c# protocol-buffers
当您尝试初始化已生成的 Google Protobuf 消息类型的重复字段成员(属性)时,您不能使用 setter,因为它们是只读的。
如何初始化 google Protobuf 消息的 RepeatedField 集合?
虽然它的语法有点奇怪,但您实际上可以像这样在集合初始值设定项中使用集合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
在消息中声明这些字段,但仍然可以使用集合初始值设定项。
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)
官方参考链接
归档时间: |
|
查看次数: |
3092 次 |
最近记录: |