我想写一个如下所示的函数
// 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
时,我可以接受一个Delegate
,并转换为一个特定的已知委托类型。
public void MyFunction(Delegate d)
{
// do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)
但这与传递整个方法组并不完全相同。这将从组中选择一个方法,并将其转换为特定的委托。我真的很想一次通过整个团队。
发布于 2009-12-25 00:21:52
您可以传递一个委托:
public void MyFunction(Delegate d)
{
// do something with the method group
}
但是,您必须在调用该方法时指定委托类型:
MyFunction(new Func<object, object, bool>(Object.Equals));
注意:上面的代码不是传递方法组,而是传递单个方法...我认为传递一个方法组是不可能的。你为什么要这么做呢?
发布于 2009-12-25 00:24:03
我认为这里有一个重要的问题:,如果你有机会被传递一个方法组,你会怎么做?
请记住,方法组只是一组方法的名称-可能有一个或多个-它们可能是重载或扩展方法。方法组不是一个保留在编译代码中的概念-编译器支持从方法组到委托的转换-但为了使这成为可能,编译器必须能够准确地解析您想要传递的方法。
只有当函数明确定义方法的签名时,方法组才能作为函数的参数有效。因此,例如:可以向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
发布于 2016-04-25 03:23:52
我认为你可以像这样使用签名:
MyFunc<T>(EventHandler<T> newDelegate)
{
object storedDelegate = newDelegate;
// after that you can use storedDelegate later
}
https://stackoverflow.com/questions/1958880
复制相似问题