我需要将具有不同数量和类型的参数的委托方法传递给另一个方法。我希望能够检查调用中参数的值。
这是我的通用缓存类。
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));
正如您所看到的,如果我可以动态确定委托调用的值,那将非常有用,因为它们可以用作缓存键。
答案 0 :(得分:1)
所以基本上,你有一个带有未知签名的方法,你想要为缓存目的而包装。如果是这种情况,你一定会想要研究一种名为 Memoization
的技术Memoization on Wikipedia 在计算中,memoization是一种优化技术,主要用于通过函数调用来避免重复计算先前处理的输入的结果来加速计算机程序。
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。这样,您可以有效地包装方法,而不会占用其余代码。它真的很无缝!