其他分享
首页 > 其他分享> > 从对象类型强制转换匿名类型

从对象类型强制转换匿名类型

作者:互联网

这个问题已经在这里有了答案:            >            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