Буферы протокола инициализации в одном выражении
Я использую буферы протокола в.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 ответ
RepeatedField<T>
реализует API списков, поэтому вы можете просто использовать инициализатор коллекции без установки нового значения:
new SearchResponse {
Results = {
new Result {
Url = "...",
Title = "...",
Snippets = { "a", "b", "c" }
}
}
}