如何在 C# 中向 ProtoBuf 重复字段添加值

Ral*_*les 5 .net grpc

我是 Grpc 新手,我希望列出请求的值列表,为此我需要一个中继器。代码如下所示。

syntax = "proto3";

option csharp_namespace = "Test.Grpc.Server.Protos";

package test;

service VcaAdministrator {
    rpc ForceStop (ForceStopRequest) returns (ForceStopResponse);
}

message ForceStopRequest{
    repeated string Id = 1;
}

message ForceStopResponse{
    bool stopped = 1;
}
Run Code Online (Sandbox Code Playgroud)

我希望将值传递给 ForceStopRequest。

        var cmd = new Command("ForceStop");
        cmd.AddOption(new Option<string>("--id", getDefaultValue: () => "null", description:"Force stop"));

        cmd.Handler = CommandHandler.Create(async (List<string> id) =>
        {
            var request = new ForceStopVcaRequest()
            {
                Id = id
            };

            var response = await vcaAdministratorClient.ForceStopVcaAsync(request);
            Console.WriteLine($"{response.Stopped} {response.ErrorCode} {response.ErrorMessage}");
        });

        return cmd;
Run Code Online (Sandbox Code Playgroud)

但上面的代码会生成错误“无法分配属性或索引器‘ForceStopRequest.Id’——它是只读的。” 如何解决这个问题?

小智 8

重复字段的任何属性都是只读的。您可以向集合添加项目或从集合中删除项目,但不能将其替换为完全独立的集合。

所以,你可以尝试一下:


var request = new ForceStopVcaRequest();
request.Id.Add(id);
Run Code Online (Sandbox Code Playgroud)


Eda*_*eed 8

不确定这是否只是 VS 版本的问题,但是

GetCompaniesReply result = new() { 
                Companies = theList
}
Run Code Online (Sandbox Code Playgroud)

不起作用但是

GetCompaniesReply result = new() { 
                Companies = {theList}
}
Run Code Online (Sandbox Code Playgroud)

将对象包装在这些额外的 {} 中对我来说很有效。