1

我需要将具有不同数量和类型的参数的委托方法传递给另一个方法。我希望能够检查调用中参数的值。

这是我的通用缓存类。

public T Get<T>(Expression<Func<T>> getItemCallback) where T : class
{

    T item = HttpRuntime.Cache.Get(hashRepresentationOfValues) as T;
    if (item == null)
    {
        item = getItemCallback.Compile()();
        HttpRuntime.Cache.Insert(
            hashRepresentationOfValues,
            item,
            null,
            DateTime.Now.AddMinutes(5),
            TimeSpan.Zero);
    }
    return item;
 }

我的电话如下所示:

private DataContext db;
return cache.Get<List<SomeDBObject>>(
    () => db.SomeDBObjectCall(param1, param2, param3));

如您所见,如果我可以动态确定委托调用的值,那将非常有帮助,因为它们可以用作缓存键。

4

1 回答 1

1

所以基本上,你有一个带有未知签名的方法,你想包装它以进行缓存。如果是这样的话,你肯定会想研究一种叫做记忆的技术

维基百科上 的记忆 在计算中,记忆是一种优化技术,主要用于通过函数调用避免重复计算先前处理的输入的结果来加速计算机程序。

C# 中这样一个函数的一个例子是这样的:

static Func<A, R> Memoize(this Func<A, R> f)
{
    var dict = new Dictionary<A, R>();
    return (A arg)=>
    {
        R result;
        if (!dict.TryGetValue(arg, out result))
        {
             result = f(arg);
             dict.Add(arg, result);
        }
        return result;
    };
}

请注意,该方法采用泛型 Func 并返回具有相同签名的泛型 Func。这样,您可以有效地包装您的方法,而不会阻塞其余代码。真是天衣无缝!

更多示例在这里这里

于 2012-07-17T16:15:44.057 回答