【问题标题】:C# pass a method as a parameter without specifying a method signatureC# 将方法作为参数传递而不指定方法签名
【发布时间】:2016-12-17 21:05:48
【问题描述】:

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

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

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

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

  • 函数[返回值] test(){}
  • 函数 [void] test(){}
  • 函数 [...] (arg1,arg2...){}

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

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

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

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

  • Func:返回值的函数的委托,Func 将指向的所有函数都必须包含完全相同的签名(不酷...)

使用对象会让我陷入昂贵的装箱/拆箱故事,我想避免这种情况。

C# 专家,跟我聊聊..

【问题讨论】:

  • 我猜答案是“C# 不是 JavaScript”——C# 不是一种动态类型的脚本语言,所以不要尝试将它作为一种语言来使用。
  • 使用一个对象会带我进入一个昂贵的装箱/拆箱故事:错误。使用 Object 可能会迫使您将对象转换为更具体的对象。铸造和拳击是两个完全不同的学科
  • 您要解决的问题是什么?我的意思是,一旦你在你的方法中获得了委托,你打算如何调用它?
  • 另外,如果你不想传入函数签名,你希望如何调用fn()?例如。我可以传入函数void f(int, int, bool, string)。您的意思是要保持只是未指定返回值吗?
  • 保持返回值和函数签名未指定

标签: c#


【解决方案1】:

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

一种解决方案可能是您调用该方法的方式。当这是您要调用的方法时:

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

这是你想通过的:

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

然后您可以使用 lambda 调用 TestMethodWithReturnType

Test(() => MethodWithReturnType());

【讨论】:

  • 但是,通过使用 Action 您指定了签名和返回值。
【解决方案2】:

您唯一真正的选择是 object function(object[]){} 但正如您所说,解释 object 实际类型存在巨大问题。 C# 是一种与 javascript 不同的强类型语言,因此您想要的功能是不可能的,如果它们是,那么它们不应该被使用,因为您将首先失去使用强类型语言的所有优势.

【讨论】:

  • 我开始觉得这是唯一的选择
  • @USS-Montana 是的,它确实在尝试做 C# 没有设计做的事情,所以你必须使用大锤方法,因此对象是一切都来源于它们。如果你认为这是要走的路,你能接受这个作为答案吗?
  • 想等一下,也许有新方法的人会让我们着迷,如果没有,我会接受。
猜你喜欢
  • 1970-01-01
  • 2015-02-12
  • 2014-07-14
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
相关资源
最近更新 更多