Я создал класс, который работает с моим кешем для получения кешированных элементов. Если элементы не кэшируются, он вызывает функцию для получения фактического значения.
Этот класс имеет восемь методов, все с почти идентичным кодом, за исключением функции, которую они вызывают. Я создал функцию под названием GetObject, которая вызывает делегата, если не может найти элемент в классе.
Я не могу скомпилировать свой код из-за следующей ошибки:
Аргумент 2: невозможно преобразовать '
System.Collections.Generic.List<string>
' в 'MyFunction<System.Collections.Generic.List<string>>
'.
Я делаю что-то не так или пытаюсь сделать что-то невозможное?
Вот код, который я пытаюсь.
public delegate T MyFunction<T>(string s);
public T GetCultures<T>(string s) where T : class {
return NewListOfStrings(s) as T;
}
public List<string> NewListOfStrings(string s) {
return new List<string> { s };
}
public List<string> GetListOfStrings(string sitename) {
string key = cachingService.CreateValidKey("stringvalue");
//This is the line that fails to compile
var foundItems = GetObject<List<string>>(key,
GetCultures<List<string>>(sitename));
return foundItems;
}
public T GetObject<T>(string key, MyFunction<T> f) where T : class {
T foundItems = (T)cachingService.GetCachedItem(key);
if (foundItems == null) {
lock (key) {
foundItems = (T)cachingService.GetCachedItem(key);
if (foundItems == null) {
foundItems = f as T;
if (foundItems != null) {
cachingService.SetCachedItem(key, foundItems, 5,
Constants.MINUTES);
}
}
}
}
return foundItems;
}
Решение
public T GetObject<T>(string key, Func<T> getFromRepository) where T : class {
T foundItems = (T)cachingService.GetCachedItem(key);
if (foundItems == null) {
lock (key) {
foundItems = (T)cachingService.GetCachedItem(key);
if (foundItems == null) {
foundItems = getFromRepository() as T;
if (foundItems != null) {
cachingService.SetCachedItem(key, foundItems, 5,
Constants.MINUTES);
}
}
}
}
return foundItems;
}
public AreaModels.Site GetSiteByName(string sitename) {
string key = cachingService.CreateValidKey(
string.Format("Site_{0}", sitename));
return GetObject<AreaModels.Site>(key,
() => efRepository.GetSiteByName(sitename));
}
public List<AreaModels.Culture> GetCulturesForSite(string sitename) {
string key = cachingService.CreateValidKey(
string.Format("Cultures_{0}", sitename));
return GetObject<List<AreaModels.Culture>>(key,
() => efRepository.GetCulturesForSite(sitename));
}
public List<AreaModels.Resource> Resources(string sitename, int appId) {
string key = cachingService.CreateValidKey(
string.Format("ResourcesFor{0}", sitename));
return GetObject<List<AreaModels.Resource>>(key,
() => efRepository.GetResourcesBySiteAndAppId(sitename, appId));
}
x => GetCultures<List<string>>(sitename)
вList<string>
, что не сработает. 15.05.2014foundItems = f as T
наfoundItems = f() as T;
, если он этого хочет. 15.05.2014as T
не нужна, так какFunction<T>
(я думаю) все равно возвращаетT
. 15.05.2014() => GetCultures<List<string>>(sitename))
, если вы изменилиMyFunction
, чтобы не принимать никаких параметров. В качестве альтернативы вы можете сделать что-то вродеname => GetCultures<List<string>>(name))
, а затем указать имя в качестве дополнительного параметра дляGetObject
. 15.05.2014GetObject
, а затем оценить его вGetObject
, вам нужно убедиться, что к строке, которую вы хотите передать, можно получить доступ изGetObject
. 15.05.2014