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

我有一堂课,需要在构造函数中传递不同数量的Func委托。这些委托中的每一个都指向一个不同的函数,每个函数具有不同的返回类型和不同数量的参数(double类型)。然后将分别调用这些函数中的每一个。

问题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)

非常感谢

参考方案

问题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所说,多态性可能更适合此处。您可以使用虚拟方法的无操作实现创建一个抽象类,并且实现可以选择要覆盖的方法。

根据激活的Maven配置文件更新战争名称 - java

在pom中,我有两个配置文件。测试1测试2现在,我希望根据激活的配置文件更改战争名称。预期结果激活test1配置文件后,战争名称应为prefix-test1.war。激活test1和test2时,战争名称应为prefix-test1-test2.war。如果没有激活任何配置文件,则战争名称应为prefix.war。我的POM文件....<?xml ve…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

当我所有的都是T时,如何返回Interface <T>的实例? - java

我有一个界面:public interface ILoginResult<T> { public T get(); } 我有一个LoginPage对象:public class LoginPage<T> { ... public ILoginResult<T> login(...) { ... } } 我也有一些登录页面对…

客户端反序列化为数组序列化字典<string,string>数据 - c#

我有一个字典,该字典使用C#中的JavaScriptSerializer进行了序列化。在客户端,我有:"{"dd049eda-e289-4ca2-8841-4908f94d5b65":"2","ab969ac2-320e-42e1-b759-038eb7f57178":"5�…

Maven的Shade插件产生的罐子之间有什么区别? - java

在我的Maven项目中,我尝试使用maven-shade-plugin在运行mvn package时生成一个超级jar。结果,我的目标目录中出现三个jar:original-hello-world-0.1.0-SNAPSHOT.jar hello-world-0.1.0-SNAPSHOT.jar hello-world-0.1.0-SNAPSHOT-shad…