【发布时间】:2018-08-02 09:46:04
【问题描述】:
我有以下代码允许我将方法作为参数传递。
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);
但是我不知道如何将方法/函数传递到第一个代码sn-p中显示的初始代码中。
编辑:我已将初始代码更改为此,它似乎正在工作。
Items = Scroll(Items, SearchCriteria,
new Func<BaseCriteria, Task<List<Data.Entities.Item>>>(x => ItemService.GetItemsAsync(SearchCriteria)));
【问题讨论】:
-
你不需要那些
new Func...声明。您可以只使用, x => ...作为 lambda。同样重要的是不要像一开始那样通过Task,因为大多数Task会立即启动,而我们实际上需要它在需要时运行,这就是我们需要使用Func<Task>的原因。 -
我现在删除了新的 Func 部分。它与这个问题无关,但现在我得到了重复的值。
-
" 但是 await serviceCall 不允许我将它作为参数传递" - 我有点困惑。您在调用
Execute(() => ItemService.GetItemsAsync(SearchCriteria))时已经将其作为参数传递了...您是否要考虑到消费者很可能在您的初始方法调用中使用两个不同的 SearchCriteria 对象? -
当我这样做时,我无法更改 Scroll 类中的 SearchCriteria。
标签: c# generics reflection action func