【问题标题】:C# Pass a generic delegate to constructorC# 将泛型委托传递给构造函数
【发布时间】:2016-10-31 09:44:02
【问题描述】:

我是 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

【问题讨论】:

标签: c# generics constructor delegates


【解决方案1】:

我不确定我是否理解了_delegateCommand 的用途——我猜它应该是返回IEnumerable&lt;TItem&gt; 的函数。如果是这样,那么您可以像这样声明它,然后您就不必引入另一个泛型参数:

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;
    }
}

【讨论】:

  • 感谢您的回答,但我认为它不会完成我想做的事情。为了更好地理解,我更新了我的课程代码。我有 3 个端点与它们的代表相关联,我希望 Page 类使用相同代码的这 3 个代表中的任何一个来避免重复。所以_delegateCommand 可以是FetchPopularShowsAsyncDelegateFetchTrendingShowsAsyncDelegateFetchMostWatchedShowsAsyncDelegate
猜你喜欢
  • 2011-06-23
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多