【问题标题】:Generic Callbacks in C#C# 中的通用回调
【发布时间】:2013-12-01 18:36:48
【问题描述】:

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

使用此实现,可以在没有参数的情况下提供回调。但是如果我有一些呢?

谢谢, 试用

【问题讨论】:

  • 不知道它有多少参数怎么调用呢?参数从哪里来?如果您将泛型限制为单一类型,也没有理由使用泛型。
  • 这就是问题所在。不知道有没有办法解决这个问题。
  • @lee,也不是他们!最好的选择是创建一个 func 来发送回调中已经存在的所有参数;例如() => MyCallback(arg1, arg2)
  • 那是糟糕的设计。最好的办法是实现一些以Func&lt;T&gt;Func&lt;T1,T2&gt; 等为参数的重载。
  • 好吧,你可以使用DynamicInvoke,但价格昂贵。

标签: c# .net generics


【解决方案1】:

这个方法应该只接受这个实现想要发送给给定函数的参数。如果它没有与此类回调相关的信息,那么它应该只是需要一个无参数委托。如果它有一些参数需要,而另一些不需要,它应该在所有情况下都提供它们,使用单个委托。

然后调用者有责任将他们想要调用的函数与委托的签名相匹配。如果他们想为某些具有您的回调所没有的参数的函数修复值,或者如果他们想调用具有较少参数的函数等,则 他们 有责任进行“转换” ,而不是该方法负责处理具有未知签名的委托。

使用 lambda 使得“转换”函数变得非常容易;比替代方案容易得多。要在回调没有参数时修复参数值,可以关闭变量:

int value = 5;
Get("key", () => SomeMethod(value));

您也可以使用 lambda 来忽略参数:

Get("key", someParameterToIgnore => AnotherMethod());

【讨论】:

    【解决方案2】:

    1) 您可以使用动态或字典作为回调的参数。放入字典或动态字符串值 - 如 CallbackType。 这很糟糕,因为您丢失了静态类型分析,但有可能。

    2)可能有用:Ellipsis notation in C#?

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多