C#中如何构造Protobuf定义的GetActiveInvoicesReply列表并在Task.FromResult返回
gRPC的protoc编译器为proto中repeated修饰的字段生成的C#类型是Google.Protobuf.Collections.RepeatedField<T>,它默认已经在消息类的构造函数中完成初始化,不需要你手动实例化,也不能直接把C#原生List<T>赋值给它,可按以下方式赋值:
完整实现代码
public override Task<GetActiveInvoicesReply> GetActiveInvoices(GetActiveInvoicesRequest request, ServerCallContext context) { var parameters = mapPartitaIva(request); var getActiveInvoices = new List<GetActiveInvoices>(); // 替换为你的实际业务逻辑,查询发票列表数据 getActiveInvoices.Add(new GetActiveInvoices { StatoFattura = "有效", Data = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow), Message = "交易完成" }); getActiveInvoices.Add(new GetActiveInvoices { StatoFattura = "待支付", Data = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow.AddDays(-3)), Message = "等待用户付款" }); return Task.FromResult(new GetActiveInvoicesReply { // 批量将List中的元素加入到RepeatedField GetActiveInvoices = { getActiveInvoices } }); }
其他可选写法
如果你更习惯显式调用方法添加,也可以写为:
var reply = new GetActiveInvoicesReply(); reply.GetActiveInvoices.AddRange(getActiveInvoices); return Task.FromResult(reply);
注意事项
- 不要尝试直接写
GetActiveInvoices = getActiveInvoices,List<T>和RepeatedField<T>是不同类型,直接赋值会编译报错 google.protobuf.Timestamp类型只支持UTC时间,赋值时请用Timestamp.FromDateTime(DateTime.UtcNow)或者Timestamp.FromDateTimeOffset(DateTimeOffset.UtcNow)创建,传入本地时间会抛出异常- proto生成的C#属性默认采用帕斯卡命名,proto中小驼峰命名的字段会自动转为大驼峰的C#属性,注意不要写错大小写
内容的提问来源于stack exchange,提问作者user16766021
相关产品推荐
相关产品推荐

