具有不同返回类型和参数数量的Func委托列表

时间:2013-03-23 21:09:12

标签: c# delegates

我有一个类需要在构造函数中传递不同数量的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)

非常感谢

1 个答案:

答案 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所说,多态可能更适合这里。您可以创建一个虚拟方法的无操作实现的抽象类,并且实现可以选择要覆盖哪些。