繁体   English   中英

具有不同返回类型和参数数量的Func委托列表

[英]List of Func delegates with varying return types and number of parameters

我有一堂课,需要在构造函数中传递不同数量的Func委托。 这些委托中的每一个都指向一个不同的函数,每个函数具有不同的返回类型和不同数量的参数(double类型)。 然后将分别调用这些函数中的每一个。

问题1.现在,为了使使用该类的人员更轻松,我正在考虑允许用户传递Func委托的List<object> 这是否可能,如果可以,我是否可以确定将List<object>传递给的方法(即构造函数)中每个Func所需的返回类型和参数数量?

问题2。如果以上方法不可行,我是否需要使用返回类型/参数数量的每种不同组合来重载构造函数,并相应地路由每个Func -_- ... ...如果没有人可以向我指出正确的方向,我觉得我正在以错误的方式来解决这个问题...

注意-来自python背景,我会做这样的事情(我在c#中没有经验):

import inspect
def test(x): return x
inspect.getargspec(test)

returns: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

非常感谢

问题1.现在,为了使使用该类的人员更轻松,我正在考虑允许用户传递Func委托列表。 这是否可能,如果可以,我是否可以确定将List传递给的方法(即构造函数)中每个Func所需的返回类型和参数数量?

并不是的。 您可以允许使用List<Delegate> (或其他元素类型为Delegate其他集合),但不能使用Func特定的Func ,这有两个原因:

  • Func实际上是类型 ,具有不同数量的泛型类型参数。 就CLR而言,这些类型是完全分开的。 Func<TResult>Func<T, TResult>Action<T>EventHandler

  • 即使您只处理同一泛型类型的委托的多个值,它们可能具有不同的类型参数这一事实也意味着它们与CLR的类型不同; 对于“可能具有不同类型参数的函数列表”,无法说出List<Func<>> 再次,CLR将它们视为单独的类型-尽管这次至少有一个具有通用的泛型类型定义。

问题2。如果上述方法不可行,我是否需要使用返回类型/参数数量的每种不同组合来重载构造函数,并相应地路由每个Func

好吧,有几种选择:

  • 将所有参数设置为可选,为每个参数提供默认值null ,然后在调用构造函数时使用命名参数:

      var foo = new Foo(clickHandler: () => ..., keyHandler: key => ...); 
  • 创建一个生成器,以便可以将各种功能设置为属性-这与对象初始化器语法非常匹配:

      var foo = new Foo.Builder { ClickHandler = () => ..., KeyHandler = () => ... }.Build(); 

当然,后两种解决方案都取决于您确实具有特定的命名目的。

如果您可以更清楚地了解要实现的目标,这将有所帮助-正如dtb所说,多态可能更适合此处。 您可以使用虚拟方法的无操作实现创建一个抽象类,并且实现可以选择要覆盖的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM