C#将方法作为参数传递,而不指定方法签名

时间:2016-08-11 08:25:31

标签: c#

我的目标是能够将一个方法作为参数传递,就像在javascript中回调一样,但不指定它的返回值或其函数签名。

例如在javascript中,我可以这样做:

function test(fn()){
fn();
}
JavaScript中的

fn()可以解释为任何函数类型:

  • function [return value] test(){}
  • function [void] test(){}
  • function [...](arg1,arg2 ...){}

(函数参数重载是可能的......)

C#并没有为“Action”和“Func”提供太多帮助。

在C#中,我可以创建一个委托,然后指定委托的类型:

  • 操作:返回void的函数的委托,Action将指向的所有函数,必须包含相同的确切签名(不酷...)

  • Func:一个函数的委托,它返回一个值,Func指向的所有函数都必须包含相同的精确签名(不酷......)

使用对象将带给我一个昂贵的拳击/拆箱故事,我想避免。

C#专家,跟我说说..

2 个答案:

答案 0 :(得分:2)

你称之为“不酷”,我称之为“类型安全”......

一种解决方案可能是您调用方法的方式。如果这是您要调用的方法:

public void Test(Action fn)
{
    fn();
}

这是你要通过的那个:

public string MethodWithReturnType()
{
    return "Hello World!";
}

然后,您可以使用lambda:

Test调用MethodWithReturnType
Test(() => MethodWithReturnType());

答案 1 :(得分:1)

你唯一真正的选择是对象函数(object []){}但正如你所说,解释对象的实际类型存在很大的问题。 C#是一种强类型语言,不像javascript,所以你想要的功能是不可能的,如果它们是,那么它们就不应该被使用,因为你将失去使用强类型语言的所有优点