我有一个类需要在构造函数中传递不同数量的 Func 委托。这些委托中的每一个都将指向不同的函数,每个函数都有不同的返回类型,并且具有不同数量的参数(双精度类型)。然后将相应地调用每个函数。
问题 1. 现在,为了让使用此类的人更容易,我正在考虑允许用户传递List<object>
Func 代表的数量。这是否可能,如果可以,我是否能够确定方法中每个 Func 所需的返回类型和参数数量List<object>
被传递给(即构造函数)?
问题 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
实际上是一个family类型,具有不同数量的泛型类型参数。就 CLR 而言,这些类型是完全独立的;Func<TResult>
and Func<T, TResult>
是不同的Action<T>
and EventHandler
.
即使您只处理相同泛型委托类型的多个值,它们可能具有不同类型参数这一事实意味着它们对于 CLR 来说是不同的类型;没有办法说List<Func<>>
对于“具有可能不同类型参数的函数列表”。同样,CLR 将它们视为单独的类型 - 尽管这一次至少具有共同的泛型类型定义。
问题 2. 如果上述方法不可行,我是否需要使用返回类型/参数数量的每种不同组合来重载构造函数,并相应地路由每个 Func
嗯,有几种选择:
-
使所有参数可选,并为每个参数指定默认值null
,然后在调用构造函数时使用命名参数:
var foo = new Foo(clickHandler: () => ...,
keyHandler: key => ...);
-
创建一个构建器,以便可以将各种函数设置为属性 - 这非常适合对象初始值设定项语法:
var foo = new Foo.Builder {
ClickHandler = () => ...,
KeyHandler = () => ...
}.Build();
当然,后两种解决方案都取决于您是否确实具有特定的指定目的。
如果您能更清楚地了解您想要实现的目标,这将会有所帮助 - 正如 dtb 所说,多态性may更适合这里。您可以创建一个带有虚拟方法的无操作实现的抽象类,并且实现可以选择要重写的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)