【问题标题】:Pass Generic Method With Parameter使用参数传递通用方法
【发布时间】: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 =&gt; ... 作为 lambda。同样重要的是不要像一开始那样通过Task,因为大多数Task 会立即启动,而我们实际上需要它在需要时运行,这就是我们需要使用Func&lt;Task&gt; 的原因。
  • 我现在删除了新的 Func 部分。它与这个问题无关,但现在我得到了重复的值。
  • " 但是 await serviceCall 不允许我将它作为参数传递" - 我有点困惑。您在调用 Execute(() =&gt; ItemService.GetItemsAsync(SearchCriteria)) 时已经将其作为参数传递了...您是否要考虑到消费者很可能在您的初始方法调用中使用两个不同的 SearchCriteria 对象?
  • 当我这样做时,我无法更改 Scroll 类中的 SearchCriteria。

标签: c# generics reflection action func


【解决方案1】:
Items = Scroll(Items, SearchCriteria, x => ItemService.GetItemsAsync(SearchCriteria));

我曾经使用以下代码来解决我的问题。

【讨论】:

  • 你为什么声明 x 但不使用它?你确定这是你想要的吗?你可能想要ItemService.GetItemsAsync(x)
  • 是的,我确定它在做我想做的事情。从那以后我一直在使用该应用程序,一切都很好。
  • 但是我的问题是你为什么要创建一个参数而不是使用它?这与() =&gt; ItemService.GetItemsAsync(SearchCriteria)... 的作用相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
相关资源
最近更新 更多