具有不同返回类型和参数数量的Func委托的列表
我有一个类需要在构造器中传递不同数量的Func委托。这些代表中的每一个都将指向一个不同的函数,每个函数具有不同的返回类型,并且具有不同数量的参数(类型为double)。这些函数中的每一个都将被相应地调用。具有不同返回类型和参数数量的Func委托的列表
问题1.现在,为了让那些使用这个类的人变得更容易,我想让用户通过Func委托人的List<object>
。这是否可能,并且如果是的话,我能够确定返回类型和每个Func所需的参数数量,方法是将List<object>
传递给(即构造函数)的方法?
问题2.如果上述不可行,我是否需要用每种不同的返回类型/参数数量的不同组合来重载构造函数,并相应地路由每个Func -_-如果没有人可以指向我正确的方向,我觉得我在错误的方式处理这个...
注 - 从蟒蛇背景的,我会做这样的事情(我在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
实际上是一个类型的家庭,用不同数量的通用类型参数。就CLR而言,这些类型完全分开;Func<TResult>
和Func<T, TResult>
与Action<T>
和EventHandler
不同。即使您只处理相同通用类型委托的多个值,但它们可能具有不同类型参数的事实意味着它们与CLR的类型不同;没有办法说
List<Func<>>
“可能有不同类型参数的函数列表”。 CLR再次将它们视为不同的类型 - 尽管这次至少有一个具有通用的泛型类型定义。
问题2:如果以上是不可行的,我将需要返回类型/ PARAMS的数量和路线的每个不同组合重载构造每个函数功能相应
嗯,有几个选项:
-
让所有的参数可选,给他们每个人的
null
默认值,然后调用构造函数时使用命名参数:var foo = new Foo(clickHandler:() => ..., keyHandler: key => ...);
-
克雷亚德建筑商,使各种功能,可设置为属性 - 这个作品非常好,对象初始化语法:
var foo = new Foo.Builder { ClickHandler =() => ..., KeyHandler =() => ... }.Build();
后两个解决方案,取决于你真的有一个特定的命名的目的,当然。
如果你可以更清楚地了解你想达到的目标,这将有所帮助 - 正如dtb所说,多态性可能在这里更合适。您可以创建一个抽象类,其中不包含虚拟方法的实现,并且实现可以选择要覆盖哪些类。
谢谢Jon。我想我会沿着使参数可选的路线走下去。只是要清楚 - 我可以将代表放入对象列表中,然后传递给构造函数?如果我能做到这一点,是否有类似于Python的inspect.getargspec方法的功能?再次感谢你的帮助。 – Sherlock 2013-03-23 21:32:18
@Sherlock:不会有任何拳击参与;代表已经是参考类型。你可以将它们全部转换为'Delegate',但它可能会很麻烦。我怀疑你仍然在过多地考虑你将在Python中做什么 - 惯用的C#通常是非常不同的,对于任何给定问题的最新解决方案在C#中可能与Python中同样问题的最新解决方案完全不同。 – 2013-03-23 21:36:55
你的设计将很多funcs传递给一个类是不寻常的。您是否考虑过为每个想要通过的func定义一个虚拟方法的类,并让用户重写这些方法? – dtb 2013-03-23 21:14:14
您:_am我能够确定每个Func_所需的参数的返回类型和数量。因为所有'Func'类型都是从'System.Delegate'派生的,所以您可以使用'List'来代替使用'List
Jeppe非常感谢 – Sherlock 2013-03-23 22:40:56