c# - 为什么 T : IMyInterface 在 C# 中工作,但 IMyInterface 不工作?
问题描述
我一直在 C# 中尝试使用泛型来改进编写样板代码。
最近,我写了这个方法来重复一个分页的 REST API 调用,直到页面用完。该方法假定对象遵循一个IPaginated
接口,该接口只有一个必需的 ID 属性。
这是我最初的实现。
/// <summary>
/// Generic implementation of getting all object from a paginated API call.
/// </summary>
/// <param name="getTask">Delegate to the API calling method, points to the last object ID or null.</param>
/// <param name="limit">The limit on # of elements.</param>
/// <returns></returns>
internal static async Task<Models.IPaginated[]> GetPaginated(Func<string, Task<Models.IPaginated[]>> getTask, int limit)
{
List<Models.IPaginated> values = new List<Models.IPaginated>();
Models.IPaginated[] page = await getTask(null);
values.AddRange(page);
while (page.Length == limit)
{
var lastobj = page[limit - 1];
page = await getTask(lastobj.ID);
values.AddRange(page);
}
return values.ToArray();
}
但是,当我写出委托对象时,这会导致编译器错误。(A 类实现 IPaginated。)
public async Task<Models.ClassA[]> GetAll(string arg1, string arg2)
{
int limit = 100;
Func<string, Task<Models.ClassA[]>> getTask = ((string lastobj) =>
{
return Get(arg1, arg2, limit, lastobj);
});
return await GetPaginated(getTask, limit);
}
所以,现在我将方法重新设计为一个由IPaginated
.
/// <summary>
/// Generic implementation of getting all object from a paginated API call.
/// </summary>
/// <param name="getTask">Delegate to the API calling method, points to the last object ID or null.</param>
/// <param name="limit">The limit on # of elements.</param>
/// <returns></returns>
internal static async Task<T[]> GetPaginated<T>(Func<string, Task<T[]>> getTask, int limit)
where T : Models.IPaginated
{
List<T> values = new List<T>();
T[] page = await getTask(null);
values.AddRange(page);
while (page.Length == limit)
{
var lastobj = page[limit - 1];
page = await getTask(lastobj.ID);
values.AddRange(page);
}
return values.ToArray();
}
这不会导致编译器错误。但为什么?以及如何 T : IPaginated 允许我在不强制转换对象的情况下检索 .ID 属性?
解决方案
推荐阅读
- c# - 超过执行时间限制 c#,同时在递归中使用 Math.Pow()
- java - 在 Spring Boot 中创建用户时,角色存储库 findAll 方法返回 null
- sql - 是否可以强制 Oracle 在使用用户定义的视图和函数的查询中应用视图合并?
- javascript - React-Select - 替换自定义选项内容的组件
- apache - Apache 多个 VirtualHost 具有相同的服务器名称、相同的 IP 和端口但不同的 DocumentRoot,可能吗?
- javascript - 从层次结构javascript创建数组
- c - 尝试接收字符并删除空格
- peoplesoft - 应用程序引擎程序 - 发生 NULL 插入错误
- jquery - 仅在选中复选框时克隆单击的 div
- c# - 如何将 C++ 回调函数传递给 C# COM 方法