在单个表达式中初始化协议缓冲区
Intialise protocol buffers in single expression
我在 .net 中使用协议缓冲区,并使用协议生成 C# 类。例如,让我们从 https://developers.google.com/protocol-buffers/docs/proto3:
获取这个 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"}
}
}
};
但是由于集合没有 setter,因此我必须跨多个表达式对其进行初始化:
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 个表达式和语句的混合体中。
有没有更简洁的方法来初始化我缺少的这些结构?
RepeatedField<T>
实现列表 API,因此您应该 能够只使用集合初始值设定项 而无需 设置新的值:
new SearchResponse {
Results = {
new Result {
Url = "...",
Title = "...",
Snippets = { "a", "b", "c" }
}
}
}
我在 .net 中使用协议缓冲区,并使用协议生成 C# 类。例如,让我们从 https://developers.google.com/protocol-buffers/docs/proto3:
获取这个 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"}
}
}
};
但是由于集合没有 setter,因此我必须跨多个表达式对其进行初始化:
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 个表达式和语句的混合体中。
有没有更简洁的方法来初始化我缺少的这些结构?
RepeatedField<T>
实现列表 API,因此您应该 能够只使用集合初始值设定项 而无需 设置新的值:
new SearchResponse {
Results = {
new Result {
Url = "...",
Title = "...",
Snippets = { "a", "b", "c" }
}
}
}