Я пытаюсь использовать класс System.Runtime.Caching.MemoryCache в .NET 4.0. У меня есть общий метод, поэтому я могу передать любой тип в кеш памяти и вернуть его при вызове.
Метод возвращает объект типа object, который является анонимным типом с полем Value, которое содержит кэшированный объект.
У меня вопрос: как вернуть объекту, который я возвращаю, соответствующий тип?
Ниже мой код…
public static class ObjectCache
{
private static MemoryCache _cache = new MemoryCache("GetAllMakes");
public static object GetItem(string key)
{
return AddOrGetExisting(key, () => InitialiseItem(key));
}
private static T AddOrGetExisting<T>(string key, Func<T> valueFactory)
{
var newValue = new Lazy<T>(valueFactory);
var oldValue = _cache.AddOrGetExisting(key, newValue, new CacheItemPolicy()) as Lazy<T>;
try
{
return (oldValue ?? newValue).Value;
}
catch
{
_cache.Remove(key);
throw;
}
}
/// <summary>
/// How can i access Value and cast to type "List<IBrowseStockVehicle>"
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private static object InitialiseItem(string key)
{
// SearchVehicleData.GetAllMakes(false) is of type List<IBrowseStockVehicle>
return new { Value = SearchVehicleData.GetAllMakes(false) };
}
}
и модульный тест ...
[TestMethod]
public void TestGetAllMakes_Cached()
{
dynamic ReturnObj = ObjectCache.GetItem("GetAllMakes");
// *********************************************
// cannot do this as tester is of type Object and doesnt have teh field Value
foreach(IBrowseStockVehicle item in ReturnObj.Value)
{
}
}
internal
, что означает, что вы должны добавить атрибут сборки, чтобы предоставить внутренние типы в тестовый проект с помощью атрибутаInternalsVisibleToAttribute
. - person Igor   schedule 04.01.2017