C# generi c невозможно преобразовать из TypeA в TypeB - PullRequest
0 голосов
/ 08 мая 2020

Я изучаю 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>>'

Как исправить?

1 Ответ

0 голосов
/ 09 мая 2020

Оказывается, мне пришлось назвать это как PaginatedList<MyClass>.CreateAsync(source, page, pageSize)

...