【问题标题】:Is there a way to supply any number of types in a generic method?有没有办法在泛型方法中提供任意数量的类型?
【发布时间】:2020-05-03 15:40:01
【问题描述】:

我的意思是我有这样的方法:

public static void CrossThreadUpdate<T1, T2, T3>(this Form form, Action<T1, T2, T3> action, object[] parms)
{
    form.BeginInvoke(action, parms);
}

但我不想为&lt;T1&gt;, &lt;T1, T2&gt;, &lt;T1, T2, T3&gt;, &lt;T1, T2, T3, T4&gt;, etc. 创建相同的函数,我正在想象类似于Foo(params string[] bar) 的东西。

【问题讨论】:

  • 不,你不能那样做。参数的数量必须在编译时知道。
  • 这个特性被称为“variadic generics”,非常少见。我相信 TypeScript 在这方面做了一些工作,但 C# 肯定没有。

标签: c#


【解决方案1】:

我会这样做:

public static void CrossThreadUpdate(this Form form, Action action) 
{
    form.BeginInvoke(action);
}

并以这种方式调用它,使用closed variables而不是尝试单独传递参数:

this.CrossThreadUpdate( () => someAction(param1, param2, param3) );

这具有类型安全的额外优势,而 params object[] 不是,并且还会导致结构类型的装箱。

【讨论】:

  • 不是我想要的答案,但实际上要好得多。
  • 我实际上一直在使用这种模式并取得了巨大的成功,甚至在另一个recent answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2022-06-21
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多