我想为System.Web.Caching.Cache编写一个包装器,它处理我的缓存请求。
如果缓存条目不存在,我需要一个可以调用回调方法的方法。问题是:我不知道回调方法有多少参数:
public T Get<T, TCallback>(string key, TCallback func) where TCallback : Func<T>
{
// check cachekey, do sth
T result = func.Invoke();
return result;
}
通过这种实现,可以在没有参数的情况下进行回调。但是,如果我有一些呢?
谢谢, 试验
答案 0 :(得分:3)
此方法应仅接受此实现要发送给给定函数的参数。如果它没有与此类回调相关的信息,那么它应该只是要求一个无参数的委托。如果某些参数需要某些参数,但其他参数则不需要,那么它应该在所有情况下使用单个代理提供它们。
然后调用者负责将他们想要调用的函数与委托的签名进行匹配。如果他们想修复某些函数的值,这些函数包含你的回调没有的参数,或者他们想要调用参数较少的函数等,那么他们负责进行“转换”而不是这种方法有责任处理具有未知签名的代表。
使用lambdas使“转换”功能变得非常容易;比替代方案容易得多。要在回调没有参数时修复参数值,可以关闭变量:
int value = 5;
Get("key", () => SomeMethod(value));
您还可以使用lambda忽略参数:
Get("key", someParameterToIgnore => AnotherMethod());
答案 1 :(得分:0)
1)您可以使用dynamic或Dictionary作为回调的参数。放入Dictionary或动态字符串值 - 比如CallbackType。 它很糟糕,因为你丢失了静态类型分析,但它有可能。
2)它可能有用:Ellipsis notation in C#?