从对象类型强制转换匿名类型
作者:互联网
这个问题已经在这里有了答案: > Cast to Anonymous Type 8个
我正在尝试利用.NET 4.0中的System.Runtime.Caching.MemoryCache类.我有一个通用的方法,因此我可以将任何类型传递到内存缓存中,并在调用时将其取回.
该方法返回类型为object的对象,该对象是具有字段Value的匿名类型,其中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)
{
}
}
解决方法:
你不能匿名类型是…匿名.它们没有您可以使用的类型名称,因此请改用类型.
当然,您仍然可以使用Reflection,但是在这种情况下可能真的不可用:
var x = ReturnObj.GetType().GetProperty("Value").GetValue(ReturnObj);
标签:generics,memorycache,c,net 来源: https://codeday.me/bug/20191026/1936092.html