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