// 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 表达式无法给出我所需要的通用性,但我可能确实漏掉了什么。
我还应该提到,如果方法组包含重载,那也没关系,只要我有一种检查方法组的方法即可。
我可以做些什么来处理方法组?我可以打印组中所有方法的签名(重载、扩展方法等),或者我可以使用一些参数来“调用”该组(如果可能,将其解析为组中的正确重载)。这些事情有其他的做法,但这是你可能想要使用方法组的一些方式。
正如几个人已经提到的,我可以接受一个委托,并在调用 MyFunction 时将其强制转换为特定的已知委托类型。
public void MyFunction(Delegate d)
{
// do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)
但这与传递整个方法组并不完全相同。这只选择了一种方法,并将其转换为特定的委托。我真的很想一次性传递整个组。
nameof
并将其作为字符串传递,但如果我直接传递方法本身并且仅在方法内部获取名称,那将更加酷炫。 - derHugo