问题描述
我在 .Net Core 3.1 中使用 C#。我有一个类,用于现有项目/其他 API:
/// <summary>Class representing a Result Set (data coming from a result page,/// plus the total count of the records coming from all the resulting pages) </summary>
/// <typeparam name="T">The class type of the result set</typeparam>
public class PagedResult<T>
{
/// <summary> Total number of rows in the result set </summary>
public long TotalRows { get; set; }
/// <summary> IList containing the data of the requested page's result set </summary>
public IList<T> PageData { get; set; } = new List<T>();
}
如何在 gRPC / Protobuf 中替换类似的内容?
我可以想到以下几点:
message PagedResult
{
int32 total_rows = 1;
repeated google.protobuf.Any page_data = 2;
}
但这需要我将每个结果都视为不同。
另一种方法是为每个 page_data
类型创建一个新消息:
message MyEntityPagedResult
{
int32 total_rows = 1;
repeated MyEntity page_data = 2;
}
我知道 protobuf 不支持继承,但是有没有办法在不在 proto 中插入大量样板的情况下管理这种响应?有什么建议吗?
谢谢!
解决方法
你可以像这样尝试在你的 shell protobuf 中使用 Any 关键字
message MyEntityPagedResult
{
int32 total_rows = 1;
any page_data = 2;
}
和你的 C# 客户端和服务器端你可以改变这个任何类型
// Read Person message from detail.
if (status.page_data.Is(__YourClassType__))
{
var person = status.page_data.Unpack<__YourClassType__>();
...
}
注意:在此解决方案中,YourClassType 必须在 proto 中定义为消息类。这可以在我看来没有任何方法可以在 proto 文件中实现类似类型:/
编辑: 此链接还可以提供有关您的问题的详细信息。 :) 有一个很好的编码 :D