GRPC C#中repeated字段赋值报错:属性为只读无法分配
GRPC C#中repeated字段无法直接赋值的原因分析
问题场景
Proto定义:
message RpcResponseListAccountModel{ int32 status = 1; repeated AccountItem Content = 2; }
C#代码尝试直接赋值时触发报错:
IList<AccountItem> retVal = new List<AccountItem>(); return new RpcResponseListAccountModel { Status = 1, Content = retVal // 报错:Property or indexer cannot be assigned to -- it is read only };
核心原因
GRPC工具生成的C#代码里,repeated字段对应的属性是**只读(仅含getter,无setter)**的。该属性返回的是消息实例内部维护的集合对象,不允许外部直接替换整个集合实例,因此直接给Content赋值新的List<AccountItem>会触发只读属性的报错。
正确操作方式
方式1:向现有集合添加元素
var retVal = new List<AccountItem>(); // 先初始化响应对象 var response = new RpcResponseListAccountModel { Status = 1 }; // 将retVal中的元素批量添加到Content集合 response.Content.AddRange(retVal); return response;
方式2:使用集合初始化器
通过集合初始化器语法,底层会自动调用集合的Add方法添加元素,而非直接赋值:
return new RpcResponseListAccountModel { Status = 1, Content = { new AccountItem { /* 初始化AccountItem属性 */ }, new AccountItem { /* 初始化AccountItem属性 */ } } };
设计逻辑说明
GRPC的C#代码生成遵循Protobuf的设计原则:repeated字段对应的集合由消息实例自身管理,禁止外部替换集合实例,以此避免集合替换带来的状态不一致问题,确保消息数据的完整性和可控性。
内容的提问来源于stack exchange,提问作者safaee007
相关产品推荐
相关产品推荐

