3

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

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

问题2。如果上述不可行,我是否需要使用返回类型/参数数量的每种不同组合重载构造函数并相应地路由每个Func -_- ...如果没有,有人可以指出我正确的方向,我觉得我以错误的方式接近这个...

注意 - 来自 python 背景,我会做这样的事情(我在 c# 中没有经验):

import inspect
def test(x): return x
inspect.getargspec(test)

returns: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

非常感谢

4

1 回答 1

7

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

并不真地。您可以允许List<Delegate>(或其他元素类型为 的集合Delegate),但没有Func特定的,原因有两个:

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

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

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

好吧,有几种选择:

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

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

     var foo = new Foo.Builder {
                   ClickHandler = () => ...,
                   KeyHandler = () => ...
               }.Build();
    

当然,后两种解决方案都取决于您是否真的有特定的命名目的。

如果您可以更清楚地了解您想要实现的目标,这将有所帮助 - 正如 dtb 所说,多态性可能更适合这里。您可以创建一个具有虚拟方法的无操作实现的抽象类,并且实现可以选择要覆盖的那些。

于 2013-03-23T21:14:47.357 回答