Я работаю над приложением MVC asp.net.MethodInfo.Invoke иногда возвращает null и иногда возвращает значение
У меня есть класс, который обертывает репозиторий, который извлекает данные из db, используя простой оператор linq. Я написал класс декоратора, чтобы добавить логику кэширования (используя блок кэширования приложений).
, так как у меня есть несколько методов, которые я хочу украсить, и логика одинакова для каждого (проверьте, существует ли в кеше, если не вызывать реальный getter и хранить в кеше), я написал примерно так:
вспомогательный метод, который делает общую логику проверки, если существует в кэше, и так далее:
public object CachedMethodCall(MethodInfo realMethod, params object[] realMethodParams)
{
object result = null;
string cacheKey = CachingHelper.GenereateCacheKey(realMethod, realMethodParams);
// check if cache contains key, if yes take data from cache, else invoke real service and cache it for future use.
if (_CacheManager.Contains(cacheKey))
{
result = _CacheManager.GetData(cacheKey);
}
else
{
result = realMethod.Invoke(_RealService, realMethodParams);
// TODO: currently cache expiration is set to 5 minutes. should be set according to the real data expiration setting.
AbsoluteTime expirationTime = new AbsoluteTime(DateTime.Now.AddMinutes(5));
_CacheManager.Add(cacheKey, result, CacheItemPriority.Normal, null, expirationTime);
}
return result;
}
это все работает отлично и прекрасно. в каждом украшенной метод У меня есть следующий код:
StackTrace currentStack = new StackTrace();
string currentMethodName = currentStack.GetFrame(0).GetMethod().Name;
var result = (GeoArea)CachedMethodCall(_RealService.GetType().GetMethod(currentMethodName), someInputParam);
return result;
проблема, что иногда линия, где realMethod.Invoke (...) происходит возвращает нуль. Если я поставил точку останова сразу после, а затем вернул выполнение в эту строку, результат не будет нулевым, а данные будут извлечены из БД. все входные переменные верны, данные существуют в БД, 2-й прогон получает данные, так что идет не так в первом запуске ?!
спасибо :)