2016-06-28 4 views
2

私はC#を初めて使用しています。ジェネリック代理人をコンストラクタに渡す方法を見つけようとしています。C#汎用代理人をコンストラクタに渡します

showエンドポイントを呼び出すとき、ページングがある場合、エンドポイントはPageインスタンスを返す必要があります。 Pageインスタンスを作成するときは、デリゲートメソッドをコンストラクタパラメータの1つとして渡す必要があります。 ShowsEndpointは多くのエンドポイントをホストし、これらのエンドポイントの多くはページネーションを使用します。すべてのエンドポイントを処理するクラスを1つだけ使用したいと思います。

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

可能でしょうか?

ありがとうございます。

EDIT

私はより良い私の質問を理解するために、私のクラスのコードを更新しました。 3つのエンドポイントがデリゲートに関連付けられており、Pageクラスでこれらの3つのデリゲートを同じコードで使用して重複を避けたいとします。したがって、_delegateCommandは、FetchPopularShowsAsyncDelegate,FetchTrendingShowsAsyncDelegateまたはFetchMostWatchedShowsAsyncDelegateとすることができます。

+0

をしていますが、このTDelegateがすべきことを指定/制限するために、where句を置く必要がありますあなたのクラスの中でそれを正しく使うことができるようにFuncなのです... [https://msdn.microsoft.com/en-us/library/bb384067(v=vs.100).aspx] –

答えて

0

私は_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; 
    } 
} 
+0

答えをありがとう私はそれが私がしたいことを達成しないと思う。私はより理解するためにクラスコードを更新しました。 3つのエンドポイントがデリゲートに関連付けられており、ページクラスでこれらのデリゲートを同じコードで使用して重複を避けるようにしたいとします。だから '_delegateCommand'は' FetchPopularShowsAsyncDelegate'、 'FetchTrendingShowsAsyncDelegate'、' FetchMostWatchedShowsAsyncDelegate'です。 – fluxb0x

関連する問題