我需要将一个具有不同数量和类型参数的委托方法传递给另一个方法。我希望能够检查调用中的参数值。
这是我的通用缓存类。
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#中这样一个函数的例子如下:
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。通过这种方式,您可以有效地包装方法,而不会混淆代码的其余部分。真是天衣无缝!
此处和此处的更多示例