我有一个
的缓存方法 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>>
有什么想法吗?
答案 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
返回的内容。