我有一个类需要在构造函数中传递不同数量的Func委托。这些代理中的每一个都将指向一个不同的函数,每个函数具有不同的返回类型,并且具有不同数量的参数(类型为double)。然后将相应地调用这些函数中的每一个。
问题1.现在,为了让使用此类的人更容易,我正在考虑允许用户传递List<object>
个Func代理。这是可能的,如果是这样,我能否确定传递List<object>
的方法中每个Func所需的返回类型和参数数量(即构造函数)?
问题2.如果上述方法不可行,我是否需要使用每种不同的返回类型组合/ params数量来重载构造函数,并相应地路由每个Func -_- ...如果没有人可以指向我正确的方向,我觉得我正以错误的方式接近这个......
注意 - 来自python背景,我会做这样的事情(我在c#中缺乏经验):
import inspect
def test(x): return x
inspect.getargspec(test)
returns: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
非常感谢
答案 0 :(得分:6)
问题1.现在,为了让那些使用这个类的人更容易,我正在考虑允许用户传递一个Func代表列表。这是可能的,如果可以,我能否确定传递List的方法中每个Func所需的返回类型和参数数量(即构造函数)?
不是真的。您可以允许List<Delegate>
(或其他一些元素类型为Delegate
的集合),但不允许Func
- 具体,原因有两个:
Func
实际上是类型的系列,具有不同数量的泛型类型参数。就CLR而言,这些类型是完全独立的; Func<TResult>
和Func<T, TResult>
与Action<T>
和EventHandler
不同。
即使您只处理相同泛型类型的委托的多个值,它们可能具有不同类型参数的事实意味着它们与CLR的类型不同;没有办法说List<Func<>>
为“具有可能不同类型参数的函数列表”。同样,CLR将它们视为单独的类型 - 尽管这次至少有一个具有共同的泛型类型定义。
问题2.如果上述方法不可行,我是否需要使用每种不同的返回类型组合/ params数量重载构造函数,并相应地路由每个Func
嗯,有几种选择:
使所有参数都是可选的,给每个参数一个默认值null
,然后在调用构造函数时使用命名参数:
var foo = new Foo(clickHandler: () => ...,
keyHandler: key => ...);
创建一个构建器,以便可以将各种函数设置为属性 - 这与对象初始化器语法非常吻合:
var foo = new Foo.Builder {
ClickHandler = () => ...,
KeyHandler = () => ...
}.Build();
当然,后两种解决方案都取决于你真正具有特定的命名目的。
如果你能更清楚地了解你想要达到的目标会有所帮助 - 正如dtb所说,多态可能更适合这里。您可以创建一个虚拟方法的无操作实现的抽象类,并且实现可以选择要覆盖哪些。