我想编写如下函数
// The type 'MethodGroup' below doesn't exist. This is fantasy-code.
public void MyFunction(MethodGroup g)
{
// do something with the method group
}
Run Code Online (Sandbox Code Playgroud)
后来,我可以打电话MyFunction用任何方法组.像这样的东西.
MyFunction(Object.Equals)
Run Code Online (Sandbox Code Playgroud)
如果我承诺签名,那么事情就可以了.
public void MyFunction(Func<object, object, bool> f)
{
// do something with known delegate
}
...
MyFunction(Object.Equals)
Run Code Online (Sandbox Code Playgroud)
方法组Object.Equals很高兴被强制转换为已知的委托类型Func<object, object, bool>,但我不想提交特定的签名.我想通过任何方法组MyFunction.
方法组无法转换为 System.Object
public void MyFunction(object o)
{
// do something with o
}
...
MyFunction(Object.Equals) // doesn't work
Run Code Online (Sandbox Code Playgroud)
我认为每个人都忘记了方法调用的大括号,并在某些时候发现了这一点.我希望这并不意味着方法组不会(或不能转换)为第一类对象.
我不认为Linq的表达会给出我正在寻找的那种普遍性,但我当然可能会遗漏一些东西.
我还应该提一下,如果方法组包含重载,那将是没问题的,前提是我有一种检查方法组的方法.
我怎么处理方法组? 我可以打印组中所有方法的所有签名(重载,扩展方法等),或者我可以用一些参数"调用"该组(如果可能的话,让它解析为组中的正确重载).还有其他方法可以执行这些操作,但它们是您可能希望使用方法组执行的一些操作.
正如几个人所提到的,我可以接受一个Delegate,并在我打电话时转换为特定的已知代表类型MyFunction.
public void MyFunction(Delegate d)
{
// do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)
Run Code Online (Sandbox Code Playgroud)
但这与传递整个方法组并不完全相同.这将从组中选择一个方法并将其转换为特定的委托.我真的想一次性通过整个小组.
我认为这里的一个重要问题是:如果你可以通过一个方法组,你会怎么做?
请记住,方法组只是一组方法的名称 - 可能有一个或多个 - 它们可能是重载或扩展方法.方法组不是在编译代码中保留的概念 - 编译器支持从方法组到委托的转换 - 但为了使这成为可能,编译器必须能够毫不含糊地解决您想要传递的方法.
如果函数明确定义方法的签名,则方法组仅作为函数的参数有效.因此,例如:public void MyFunction( Func<int> f )可以传递一个方法组.
你最接近的是写一个接受代表类型的函数:
public void MyFunction( Delegate d ) { ... }
Run Code Online (Sandbox Code Playgroud)
但是您仍然无法传递方法组,因为没有从方法组到Delegate的转换.您必须转换为特定的委托签名:
// call MyFunction with a particular delegate
MyFunction( (Func<string>)myObj.ToString ); // method group conversion may occur
Run Code Online (Sandbox Code Playgroud)
你可以传递一个代表:
public void MyFunction(Delegate d)
{
// do something with the method group
}
Run Code Online (Sandbox Code Playgroud)
但是,在调用方法时,您必须指定委托类型:
MyFunction(new Func<object, object, bool>(Object.Equals));
Run Code Online (Sandbox Code Playgroud)
注意:上面的代码不是传递方法组而是传递单个方法......我认为不可能传递方法组.你为什么想这么做 ?
| 归档时间: |
|
| 查看次数: |
10740 次 |
| 最近记录: |