Буферы протокола инициализации в одном выражении - PullRequest
0 голосов
/ 30 января 2019

Я использую буферы протокола в .net и генерирую классы C # с помощью protoc.Например, давайте возьмем этот файл proto3 из https://developers.google.com/protocol-buffers/docs/proto3:

message SearchResponse {
  repeated Result results = 1;
}

message Result {
  string url = 1;
  string title = 2;
  repeated string snippets = 3;
}

и попробуем инициализировать сгенерированные классы C #.

Они выглядят примерно так

public class SearchResponse
{
    public RepeatedField<Result> Results { get; } = new RepeatedField<Result>();
}

public class Result
{
    public string Url { get; set; }
    public string Title { get; set; }
    public RepeatedField<string> Snippets { get; } = new RepeatedField<string>();
}

Теперь давайте попробуем инициализировать это.В идеале я хотел бы иметь возможность сделать что-то вроде этого:

SearchResponse GetSearchResponse => new SearchResponse
{
    Results = new RepeatedField<SearchResponse>
    {
        new Result
        {
            Url = "..."
            Title = "..."
            Snippets = new RepeatedField<string> {"a", "b", "c"}
        }
    }
};

Однако, поскольку коллекции не имеют сеттеров, вместо этого я должен инициализировать это для нескольких выражений:

SearchResponse GetSearchResponse
{
    get
    {
        var response = new SearchResponse();
        var result = new Result
        {
            Url = "..."
            Title = "..."
        }
        result.Snippets.AddRange(new[]{"a", "b", "c"});
        response.Results.Add(result);
        return response;
    }
}

И что в идеале можно сделать, чтобы одно выражение распространялось на смесь из 5 выражений и операторов.

Есть ли какой-то более аккуратный способ инициализации этих структур, которые я пропускаю?

1 Ответ

0 голосов
/ 30 января 2019

RepeatedField<T> реализует API списков, поэтому вы должны иметь возможность просто использовать инициализатор коллекции без установки нового значения:

new SearchResponse {
    Results = {
        new Result {
            Url = "...",
            Title = "...",
            Snippets = { "a", "b", "c" }
        }
    }
}
...