【问题标题】:Need to inspect the values of a delegate method需要检查委托方法的值
【发布时间】:2012-07-17 16:06:14
【问题描述】:

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

这是我的通用缓存类。

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));

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

【问题讨论】:

    标签: c# .net httpruntime


    【解决方案1】:

    所以基本上,您有一个带有未知签名的方法,您想要包装它以用于缓存目的。如果是这种情况,您肯定会想研究一种称为 Memoization

    的技术

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

    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。这样,您可以有效地包装您的方法,而不会阻塞其余代码。真是天衣无缝!

    更多示例herehere

    【讨论】:

    • 我喜欢 Memoization 的通用性,但如果我没记错的话,它或多或少是由运行时缓存索引处理的。我想让 .NET 处理缓存的管理。我只需要一个更简单的方法来创建缓存键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多