Не могу сделать этот Funcработать - PullRequest
1 голос
/ 14 января 2012

У меня есть метод кэширования, который

 public TReturn Get<TParam, TReturn>(string cacheId, Func<TParam, TReturn> getItemCallback, TParam argument)
        where TReturn : class
        where TParam : class
    {
        TReturn item = (TReturn)HttpRuntime.Cache.Get(cacheId);
        if (item == null)
        {
            item = getItemCallback(argument);
            HttpContext.Current.Cache.Insert(cacheId, item);
        }
        return item;
    }

, и я пытаюсь его использовать, и, похоже, мне здесь не повезло ... обычно он должен работать.Я использую его таким образом.

 public List<LookupParameter> GetAllLookupEntries(string tableContext)
 {
     return _cacheProvider.Get<string,List<LookupParameter>>("", 
         _lookupTableRepository.GetAllLookupEntries(tableContext), "");
 }

Говорят, что он не может конвертировать System.Collections.Generic.List<Pyrosphere.Providers.LookupParameter> в System.Func<string,System.Collections.Generic.List<Pyrosphere.Providers.LookupParameter>>

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 14 января 2012

Проблема в том, что вы передаете List<string> в качестве второго параметра, и он ожидает Func<string, List<string>>.Попробуйте передать второй аргумент как лямбда-выражение

return _cacheProvider.Get<string,List<LookupParameter>>(
  "", 
  arg => _lookupTableRepository.GetAllLookupEntries(arg), 
  tableContext);

Также может быть немного проще, если вы измените свою функцию Get, чтобы она не принимала аргумент.Аргумент передается методу Get, а затем немедленно передается делегату, и между ними ничего не делается.Таким образом, сайт вызова может быть намного проще, если он обрабатывает аргумент напрямую.Например

public TReturn Get<TReturn>(string cacheId, Func<TReturn> getItemCallback)
    where TReturn : class
{
    TReturn item = (TReturn)HttpRuntime.Cache.Get(cacheId);
    if (item == null)
    {
        item = getItemCallback();
        HttpContext.Current.Cache.Insert(cacheId, item);
    }
    return item;
}


return _cacheProvider.Get<List<LookupParameter>>(
  "", 
  ()=> _lookupTableRepository.GetAllLookupEntries(tableContext));
1 голос
/ 14 января 2012

Вы вызываете функцию GetAllLookupEntries и передаете возвращаемое значение (предположительно, List), где тип аргумента ожидает функцию обратного вызова.

Попробуйте использовать лямбду, чтобы сделать более четкое различие между передачей функции какаргумент против передачи результата вызова функции:

return _cacheProvider.Get<string, List<LookupParameter>>("", 
    r => _lookupTableRepository.GetAllLookupEntries(r), "");
0 голосов
/ 14 января 2012

Что возвращает _lookupTableRepository.GetAllLookupEntries(tableContext)?

Второй параметр вашего метода имеет тип Func<TParam, TReturn>.Убедитесь, что это то, что возвращает ваш GetAllLookupEntries.

...