You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:15:03