C#中的通用回调

时间:2013-11-18 14:51:48

标签: c# .net generics

我想为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;
}

通过这种实现,可以在没有参数的情况下进行回调。但是,如果我有一些呢?

谢谢, 试验

2 个答案:

答案 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#?