2013-03-23 49 views
2

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

你的设计将很多fun​​cs传递给一个类是不寻常的。您是否考虑过为每个想要通过的func定义一个虚拟方法的类,并让用户重写这些方法? – dtb 2013-03-23 21:14:14

+1

您:_am我能够确定每个Func_所需的参数的返回类型和数量。因为所有'Func'类型都是从'System.Delegate'派生的,所以您可以使用'List '来代替使用'List '。然后如果'd'是'List '的一个元素,你可以使用'd.Method.ReturnType'和'd.Method.GetParameters()'来获得你要求的信息。你可以用'd.DynamicInvoke'调用委托。 – 2013-03-23 22:21:49

+0

Jeppe非常感谢 – Sherlock 2013-03-23 22:40:56

回答

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的数量和路线的每个不同组合重载构造每个函数功能相应

嗯,有几个选项:

  • 让所有的参数可选,给他们每个人的null默认值,然后调用构造函数时使用命名参数:

    var foo = new Foo(clickHandler:() => ..., 
            keyHandler: key => ...); 
    
  • 克雷亚德建筑商,使各种功能,可设置为属性 - 这个作品非常好,对象初始化语法:

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

后两个解决方案,取决于你真的有一个特定的命名的目的,当然。

如果你可以更清楚地了解你想达到的目标,这将有所帮助 - 正如dtb所说,多态性可能在这里更合适。您可以创建一个抽象类,其中不包含虚拟方法的实现,并且实现可以选择要覆盖哪些类。

+0

谢谢Jon。我想我会沿着使参数可选的路线走下去。只是要清楚 - 我可以将代表放入对象列表中,然后传递给构造函数?如果我能做到这一点,是否有类似于Python的inspect.getargspec方法的功能?再次感谢你的帮助。 – Sherlock 2013-03-23 21:32:18

+1

@Sherlock:不会有任何拳击参与;代表已经是参考类型。你可以将它们全部转换为'Delegate',但它可能会很麻烦。我怀疑你仍然在过多地考虑你将在Python中做什么 - 惯用的C#通常是非常不同的,对于任何给定问题的最新解决方案在C#中可能与Python中同样问题的最新解决方案完全不同。 – 2013-03-23 21:36:55

相关问题