无法使此Func <t,t>工作</t,t>

时间:2012-01-13 23:06:38

标签: c# .net func

我有一个

的缓存方法
 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 个答案:

答案 0 :(得分:4)

问题是您传递List<string>作为第二个参数,它期待Func<string, List<string>>。尝试将第二个参数作为lambda表达式传递

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 :(得分:1)

您正在调用GetAllLookupEntries函数并传递返回值(可能是List),其中参数类型需要回调函数。

尝试使用lambda在将函数作为参数传递与传递函数调用结果之间做出更明确的区分:

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

答案 2 :(得分:0)

_lookupTableRepository.GetAllLookupEntries(tableContext)返回什么?

您方法的第二个参数是Func<TParam, TReturn>类型。确保这是GetAllLookupEntries返回的内容。