【发布时间】:2018-08-23 03:45:21
【问题描述】:
我想写一个类似下面的函数
// The type 'MethodGroup' below doesn't exist. This is fantasy-code.
public void MyFunction(MethodGroup g)
{
// do something with the method group
}
后者,我可以用 any 方法组调用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)
但这与传递整个方法组并不完全相同。这会从组中选择一种方法并将其转换为特定的委托。我真的很想一口气通过整个小组。
【问题讨论】:
标签: c#