【问题标题】:C# generic cannot convert from TypeA to TypeBC# 泛型无法从 Type 转换为 Type
【发布时间】:2020-05-08 07:50:26
【问题描述】:

我正在学习 C# 来自 Java,我知道这个平台上有很多这样的问题,我已经检查了它们,但没有一个能解释我的问题。我喜欢C#Java 有很多相似之处,这让我的过渡更快更顺畅,也就是说我正在构建一个API,它将返回一个paginated result,分页效果很好,当我尝试引入Single 响应对象时出现问题,无论端点如何,我的API 都会返回,我的响应类看起来像这样

public class PaginatedResponse<T>
{

    public PaginatedList<T> PaginatedList;
    public int Page { get; set; }
    public int PageSize { get; set; }

    public Boolean HasNextPage { get; set; }

    public Boolean HasPreviousPage { get; set; }
    public int TotalItemCount { get; set; }


}

我希望它返回有关分页的元数据,这应该与我的分页类一起工作,看起来像这样

 public class PaginatedList<T> : List<T>
{
    public int PageIndex { get; private set; }
    public int TotalPages { get; private set; }

    public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        TotalPages = (int)Math.Ceiling(count / (double)pageSize);

        this.AddRange(items);
    }

    public bool HasPreviousPage
    {
        get
        {
            return (PageIndex > 1);
        }
    }

    public bool HasNextPage
    {
        get
        {
            return (PageIndex < TotalPages);
        }
    }

    public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
    {
        var count = await source.CountAsync();
        var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
        return new PaginatedList<T>(items, count, pageIndex, pageSize);
    }
}

再次像我说的那样,分页效果很好,当我需要返回 PaginatedResponse 而不是 PaginatedList 时出现问题

所以我将CreateAsync 方法修改为如下所示

public static async Task<PaginatedResponse<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
    {      
        var count = await source.CountAsync();
        var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
        var totalPages = (int)Math.Ceiling(count / (double)pageSize);

        return new PaginatedResponse<T>
        {
            PageSize = pageSize,
            TotalItemCount = count,
            HasNextPage = pageIndex < totalPages,
            HasPreviousPage = pageIndex > 1,
            PaginatedList = new PaginatedList<T>(items, count, pageIndex, pageSize)
        };

    }

我现在的问题是当我尝试调用 CreateAsync

IQueryable<MyClass> source = SourceCreator.CreateSource();

return await PaginatedList<PaginatedResponse<MyClass>>.CreateAsync(source, page, pageSize);

它给了我错误

cannot convert from 'System.Linq.IQueryable<MyClass>' to 'System.Linq.IQueryable<PaginatedResponse<MyClass>>'

我该如何解决这个问题?

【问题讨论】:

  • CreateAsync 返回一个PaginatedResponse&lt;T&gt;。您的TMyClassPaginatedResponse&lt;MyClass&gt;PaginatedList&lt;PaginatedResponse&lt;MyClass&gt;&gt; 不同。
  • CreateAsyncPaginatedList 类中的一个静态方法,要访问它我需要执行PaginatedList.CreateAsync 之类的操作,但因为它有返回值,所以我需要知道如何调用它跨度>
  • 换句话说,当您调用PaginatedList&lt;PaginatedResponse&lt;MyClass&gt;&gt;.CreateAsync([...]) 时,T 现在是PaginatedResponse&lt;MyClass&gt;(并且不是 MyClass!)。但是你给它一个sourceIQueryable&lt;MyClass&gt; 并且该方法正确地拒绝了:嘿,我想要一个IQueryable&lt;T&gt;。我的TPaginatedResponse&lt;MyClass&gt;,所以我期待IQueryable&lt;PaginatedResponse&lt;MyClass&gt;&gt;。但是你给了我一个IQueryable&lt;MyClass&gt;,好像你期望我的TMyClass(它不是)。如果您希望 that 起作用,请询问我的兄弟PaginatedList&lt;MyClass&gt;CreateAsync。也许他们可以提供帮助。

标签: c# linq linq-to-sql


【解决方案1】:

原来我不得不把它称为PaginatedList&lt;MyClass&gt;.CreateAsync(source, page, pageSize)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2013-11-03
    • 2012-08-17
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多