是否可以将任意方法组作为参数传递给方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我想写一个如下的函数

// The type 'MethodGroup' below doesn't exist.  This is fantasy-code.
public void MyFunction(MethodGroup g)
{
    // do something with the method group
}

后来,我可以MyFunction任何方法组呼叫。像这样的东西。

MyFunction(Object.Equals)

如果我承诺签名,那么事情工作正常。

public void MyFunction(Func<object, object, bool> f)
{
    // do something with known delegate
}
...
MyFunction(Object.Equals)

方法组Object.Equals被高兴地强制转换为已知的委托类型Func<object, object, bool>,但我不想承诺特定的签名。我想通过任何方法组MyFunction

方法组不能转换为 System.Object

public void MyFunction(object o)
{
    // do something with o
}
...
MyFunction(Object.Equals) // doesn't work

我认为大家都忘记了方法调用的大括号,并在某个时候发现了这一点。我希望这并不意味着这些方法组不是(或不能转换成)第一类对象。

我不认为Linq表达式会给我所寻找的那种普遍性,但我肯定会错过一些东西。

我还应该提到,如果方法组包含重载,那么应该没问题,前提是我有办法检查方法组。

我会用方法组做什么? 我可以打印组中所有方法的所有签名(重载,扩展方法等),或者我可以用一些参数“调用”该组(如果可能的话,解决组中正确的重载问题)。还有其他的方法可以做这些事情,但他们是你可能想用一个方法组来做的事情。

正如几位人士所提到的,我可以接受一个Delegate,并且在我打电话时投给一个特定的已知委托类型MyFunction

public void MyFunction(Delegate d)
{
    // do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)

但是这与传递整个方法组并不完全相同。这将从组中选择一种方法并将其转换为特定的代理。我真的很想一次性通过整个小组。

提问于
用户回答回答于

你可以传递一个委托:

public void MyFunction(Delegate d)
{
    // do something with the method group
}

但是,你在调用方法时必须指定委托类型:

MyFunction(new Func<object, object, bool>(Object.Equals));

注意:上面的代码不是传递一个方法组,而是一个单一的方法......我不认为有可能传递一个方法组。你为什么想这么做 ?

用户回答回答于

我认为这里一个重要的问题是:如果你能通过一个方法组,你会怎么做?

请记住,方法组只是一组方法的名称 - 可能有一个或多个 - 它们可能是重载或扩展方法。方法组不是一个保存在编译代码中的概念 - 编译器支持从方法组到代表的转换 - 但为了使这成为可能,编译器必须能够毫不含糊地解决您想要传递的方法。

如果函数明确定义了方法的签名,则方法组仅作为函数的参数有效。所以,例如:public void MyFunction( Func<int> f )可以通过一个方法组。

你可以最接近的是编写一个接受Delegate类型的函数:

public void MyFunction( Delegate d ) { ... }

但是你仍然无法传入方法组,因为没有从方法组到委托的转换。你将不得不投入特定的代表签名:

// call MyFunction with a particular delegate
MyFunction( (Func<string>)myObj.ToString );  // method group conversion may occur

扫码关注云+社区