繁体   English   中英

C#将通用委托传递给构造函数

[英]C# Pass a generic delegate to constructor

我是C#的新手,我试图找到一种将通用委托传递给构造函数的方法。

调用show端点时,如果存在分页,则端点应返回Page实例。 创建Page实例时,委托方法应作为构造函数参数之一传递。 ShowsEndpoints将托管许多端点,并且其中许多端点使用分页。 我只想使用一个类来处理所有端点。

public partial class ShowsEndpoints : Endpoint
{
    public Func<Task<IEnumerable<object>>> FetchPopularShowsAsyncDelegate;
    public Func<Task<IEnumerable<object>>> FetchTrendingShowsAsyncDelegate;
    public Func<Task<IEnumerable<object>>> FetchMostWatchedShowsAsyncDelegate;

    public async Task<IEnumerable<object>> FetchPopularShowsAsync(int page = 1, int limit = 20)
    {
        return await SendAsync(new PopularShowsRequest(page, limit));
    }

    public async Task<IEnumerable<object>> FetchTrendingShowsAsync(int page = 1, int limit = 20)
    {
        return await SendAsync(new TrendingShowsRequest(page, limit));
    }

    public async Task<IEnumerable<object>> FetchMostWatchedShowsAsync(int page = 1, int limit = 20)
    {
        return await SendAsync(new MostWatchedShowsRequest(page, limit));
    }
}

页面类,如果存在下一页,它将调用委托以获取下一页。

public class Page<TItem, TDelegate>
{
    private TDelegate _delegateCommand;

    public int CurrentPage { get; }
    public int TotalPages { get; }
    public int PageItemsCount { get; }
    public int TotalItemsCount { get; }
    public IEnumerable<TItem> Items { get; }

    public Page(int page, int totalPages, int itemsCount, int totalItemsCount, IEnumerable<TItem> items, TDelegate delegateCommand)
    {
        CurrentPage = page;
        TotalPages = totalPages;
        PageItemsCount = itemsCount;
        TotalItemsCount = totalItemsCount;
        Items = items;
        _delegateCommand = delegateCommand;
    }

    public bool HasNext()
    {
        return CurrentPage <= TotalPages;
    }

    public bool HasPrevious()
    {
        return CurrentPage >= 1;
    }

    public Page<TItem, TDelegate> Next()
    {
        // call _delegateCommand to fetch the next page items
    }

    public Page<TItem, TDelegate> Previous()
    {
        // call _delegateCommand to fetch the previous page items
    }
}

可能吗 ?

谢谢。

编辑

我已经更新了班级代码,以更好地理解我的问题。 我有3个与它们的委托相关联的端点,并且我希望Page类使用这3个委托中的任何一个使用相同的代码来避免重复。 因此_delegateCommand可以是FetchPopularShowsAsyncDelegateFetchTrendingShowsAsyncDelegateFetchMostWatchedShowsAsyncDelegate

我不确定我_delegateCommand正确使用_delegateCommand的目的-我想应该是返回IEnumerable<TItem> 如果是这样,那么您可以像这样精确地声明它,那么您就不必引入另一个通用参数:

public class Page<TItem>
{
    private Func<IEnumerable<TItem>>_delegateCommand;

    public int CurrentPage { get; }
    public int TotalPages { get; }
    public int PageItemsCount { get; }
    public int TotalItemsCount { get; }
    public IEnumerable<TItem> Items { get; }

    public Page(int page, int totalPages, int itemsCount,
                int totalItemsCount, IEnumerable<TItem> items,
                Func<IEnumerable<TItem>> delegateCommand)
    {
        CurrentPage = page;
        TotalPages = totalPages;
        PageItemsCount = itemsCount;
        TotalItemsCount = totalItemsCount;
        Items = items;
        _delegateCommand = delegateCommand;
    }

    public bool HasNext()
    {
        return CurrentPage <= TotalPages;
    }

    public bool HasPrevious()
    {
        return CurrentPage >= 1;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM