картареализация в grpc для .netCore - PullRequest
0 голосов
/ 04 декабря 2018

Использование карты в файле прото grpc для ядра .net для отправки словаря в качестве параметра запроса делает его закрытым полем (только для чтения) в автоматически сгенерированном коде.Поэтому я не могу назначить словарь для сопоставления и передать его в запросе API.Как мне сделать это read-write.?

Sample proto request: 

service xyz{
rpc testTrans(TestRequest) returns (TestResponse);
}
message TestRequest {
  map<string,string> props = 1;
}

, чтобы автоматически сгенерированный код выглядел так:

    public const int PropsFieldNumber = 1;

    private static readonly pbc::MapField<string, string>.Codec _map_Props_codec
        = new pbc::MapField<string, string>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForString(18), 10);

    private readonly pbc::MapField<string, string> Props_ = new pbc::MapField<string, string>();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public pbc::MapField<string, string> Props {
      get { return Props_; }
    }

Так что теперь, когда я пытаюсь назначить свойство в запросе, как показано ниже, выдает ошибку: Свойство или индексатор TestRequest.Props не может быть назначен - он только для чтения.

       public static void testTrans(Dictionary<string, string> test)
        {
             var res = client.InitTrans(new TestRequest
                {
                    Props = test
                });
        }

1 Ответ

0 голосов
/ 04 июня 2019

Кажется, что это предотвращается, когда вы хотите напрямую объявить и инициализировать значение с помощью:

var res = client.InitTrans(new TestRequest
            {
              //Property could not be assigned to -- it is read only...error
              Props = new Map<string,string>.Add("somekey", "somevalue");
              // Alternatively the same problem will also occur when you do
              // Props = new Map<string,string>.Add(SomeDict);
            }

Вместо этого следует обойтись путем инициализации вашей переменной, а затем добавить значение (я) ксловарь позже (после инициализации всего объекта сообщения).

     var res = new TestRequest{};

     //test is some dictionary

     res.TestRequest.Props.Add(test);

     //alternatively you can also add with (key, value)

     res.TestRequest.Props.Add("someKey", "someValue);
...