Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有不同返回类型和参数数量的Func委托列表_C#_Delegates - Fatal编程技术网

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

C# 具有不同返回类型和参数数量的Func委托列表,c#,delegates,C#,Delegates,我有一个类需要在构造函数中传递不同数量的Func委托。每个委托将指向不同的函数,每个函数具有不同的返回类型和不同数量的参数(类型为double)。然后将相应地调用这些函数中的每一个 问题1。现在,为了让使用这个类的人更容易,我考虑允许用户传递Func委托的列表。这可能吗?如果可能,我是否能够确定列表传递给(即构造函数)的方法中每个函数所需的返回类型和参数数 问题2。如果上述方法不可行,我是否需要使用返回类型/参数数量的每个不同组合重载构造函数,并相应地路由每个函数--。。。如果没有人能给我指出正

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

问题1。现在,为了让使用这个类的人更容易,我考虑允许用户传递Func委托的
列表。这可能吗?如果可能,我是否能够确定
列表
传递给(即构造函数)的方法中每个函数所需的返回类型和参数数

问题2。如果上述方法不可行,我是否需要使用返回类型/参数数量的每个不同组合重载构造函数,并相应地路由每个函数--。。。如果没有人能给我指出正确的方向,我觉得我走错了方向

注意-来自python背景,我会做类似的事情(我对c#缺乏经验):

非常感谢

问题1。现在,为了让使用这个类的人更容易,我考虑允许用户传递Func委托列表。这是否可能,如果可能,我是否能够确定列表传递给(即构造函数)的方法中每个Func所需的返回类型和参数数

不是真的。您可以允许一个
列表
(或元素类型为
委托
)的其他集合,但不允许任何特定于
函数的集合,原因有二:

  • Func
    实际上是一个类型族,具有不同数量的泛型类型参数。就CLR而言,这些类型是完全独立的
    Func
    Func
    Action
    EventHandler
    一样不同

  • 即使您只处理同一泛型委托类型的多个值,但它们可能具有不同的类型参数这一事实意味着它们对于CLR来说是不同的类型;对于“具有潜在变化类型参数的函数列表”,没有办法说
    List
    。同样,CLR将它们视为单独的类型—尽管这次至少有一个具有通用类型定义

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

嗯,有几种选择:

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

     var foo = new Foo(clickHandler: () => ...,
                       keyHandler: key => ...);
    
  • 创建一个生成器,以便将各种函数设置为属性-这与对象初始值设定项语法配合得很好:

     var foo = new Foo.Builder {
                   ClickHandler = () => ...,
                   KeyHandler = () => ...
               }.Build();
    
当然,后两种解决方案都取决于您是否真正具有特定的命名目的


如果你能更清楚地了解自己想要实现的目标,这会有所帮助——正如dtb所说,多态性可能更适合这里。您可以创建一个抽象类,而不使用虚拟方法的op实现,实现可以选择覆盖哪些方法。

您将大量函数传递给一个类的设计是不寻常的。您是否考虑过为要传递的每个func定义一个具有一个虚拟方法的类,并允许用户重写这些方法?您:我是否能够确定每个func所需的返回类型和参数数,而不是使用
列表
,您可以使用
List
,因为所有
Func
类型都源自
System.Delegate
。然后,如果
d
列表的一个元素,则可以使用
d.Method.ReturnType
d.Method.GetParameters()
来获取所需的信息。您可以使用
d.DynamicInvoke
调用该委托。谢谢Jon。我想我会继续选择参数。我想澄清一下,我可以将委托放入一个对象列表中,然后传递给构造函数吗?如果我能做到这一点,c中是否有类似于python inspect.getargspec方法的功能?再次感谢您的帮助。@Sherlock:不会涉及任何拳击;委托已经是引用类型。您可以将它们全部转换为
委托
,但这可能会很混乱。我怀疑您仍然在过多地考虑如何使用Python—惯用C#通常是非常不同的,任何给定问题的最简洁的解决方案在C#中可能与Python中相同问题的最简洁的解决方案完全不同。
 var foo = new Foo.Builder {
               ClickHandler = () => ...,
               KeyHandler = () => ...
           }.Build();