1
public class Stock
{
}

class Program
{
    static void Main(string[] args)
    {
        ObjectCache cache = MemoryCache.Default;
        cache["test"] = new Stock();
        var x = cache.OfType<Stock>().ToList();
    }
}

This is returning empty ...I thought OfType is supposed to return all instances in a collection of type T ?

Just to rule out the ObjectCache as a possible culprit I also tried

List<object> lstTest = new List<object>();
        lstTest.Add(new Stock());
        var y = lstTest.OfType<Stock>().ToList();

This works however - so it seems like the problem is with the ObjectCache, which is an instance of a Dictionary underneath

SOLUTION

cache.Select(item => item.Value).OfType<T>().ToList()

Thanks Alexei!

4

4 回答 4

5

MemoryChache 返回 的枚举数KeyValuePair<string,Object>,而不仅仅是值:MemoryChache.GetEnumerator()

您需要相应地获取您的物品。就像是:

var y = cache.Select(item => item.Value).OfType<Stock>();
于 2012-08-22T01:18:06.793 回答
2

这会起作用

cache.GetValues(new string[] {"test"}).Values.OfType<Order>()

但我认为你不应该使用它。KeyValuePairs缓存就像字典一样工作......所以你可以得到一套GetValues

于 2012-08-22T01:19:28.547 回答
0

这对我有用。

公共类股票{公共股票(){名称=“艾琳”;} 公共字符串名称 { 获取;放; } }

class Program
{
    static void Main(string[] args)
    {
        System.Collections.ArrayList fruits = new System.Collections.ArrayList(4);
        fruits.Add("Mango");
        fruits.Add("Orange");
        fruits.Add("Apple");
        fruits.Add(3.0);
        fruits.Add("Banana");
        fruits.Add(new Stock());

        // Apply OfType() to the ArrayList.
        var query1 = fruits.OfType<Stock>();

        Console.WriteLine("Elements of type 'stock' are:");
        foreach (var fruit in query1)
        {
            Console.WriteLine(fruit);
        }

    }
}

记住 IEnumerable 是惰性求值的。使用 foreach 遍历 query1,您会看到它只找到 Stock 对象。

于 2012-08-22T01:18:18.087 回答
0

是的。对不起自己。ObjectCache 是一个 IEnumerable> 不是真正的 IDictionary。

这有效:

var c = cache.Select(o => o.Value).OfType<Stock>().ToList();
于 2012-08-22T01:13:49.857 回答