通过参数传递通用方法

时间:2018-08-02 09:46:04

标签: c# generics reflection action func

我有以下代码,允许我将方法作为参数传递。

Items = Scroll(Items, SearchCriteria, Execute(() => ItemService.GetItemsAsync(SearchCriteria)));

然后我的Scroll类看起来像这样

public InfiniteScrollCollection<T> Scroll<T>(InfiniteScrollCollection<T> source, BaseCriteria baseCriteria, Task<List<T>> serviceCall)
{
    this.BaseSearchCriteria = baseCriteria;

    source = new InfiniteScrollCollection<T>
    {
        OnLoadMore = async () =>
        {
            IsBusy = true;

            // load the next page
            this.BaseSearchCriteria.PageIndex = source.Count / this.BaseSearchCriteria.PageSize;

            var items = await serviceCall;

            IsBusy = false;

            // return the items that need to be added
            return items;
        },
        OnCanLoadMore = () =>
        {
            return source.Count < this.MaxCalls;
        }
    };

    DownloadDataAsync(source, serviceCall);

    return source;
}

我的问题出现在this.BaseSearchCriteria.PageIndex = source.Count / this.BaseSearchCriteria.PageSize;行上

我需要增加PageIndex,它是GetItemsAsync中使用的参数的属性。我可以更改BaseSearchCriteria PageIndex属性,但是await serviceCall不允许我将其作为参数传递。

那么我有办法改变serviceCall参数吗?

我尝试将scroll参数更改为

public InfiniteScrollCollection<T> Scroll<T>(InfiniteScrollCollection<T> source, BaseCriteria baseCriteria, Func<BaseCriteria, Task<List<T>>> serviceCall)

然后,我可以将更新的条件传递给serviceCall

var items = await serviceCall(this.BaseSearchCriteria);

但是后来我不知道如何将方法/函数传递到第一个代码段中显示的初始代码中。

编辑:我已经将初始代码更改为此,并且似乎可以正常工作。

Items = Scroll(Items, SearchCriteria, 
            new Func<BaseCriteria, Task<List<Data.Entities.Item>>>(x => ItemService.GetItemsAsync(SearchCriteria)));

1 个答案:

答案 0 :(得分:0)

Items = Scroll(Items, SearchCriteria, x => ItemService.GetItemsAsync(SearchCriteria));

我曾经遵循以下代码来解决我的问题。