首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以将任意方法组作为参数传递给方法吗?

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

Stack Overflow用户
提问于 2009-12-25 00:15:15
回答 4查看 13.7K关注 0票数 24

我想写一个如下所示的函数

// 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)

但这与传递整个方法组并不完全相同。这将从组中选择一个方法,并将其转换为特定的委托。我真的很想一次通过整个团队。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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));

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

票数 7
EN

Stack Overflow用户

发布于 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
票数 8
EN

Stack Overflow用户

发布于 2016-04-25 03:23:52

我认为你可以像这样使用签名:

MyFunc<T>(EventHandler<T> newDelegate)
{
    object storedDelegate = newDelegate;
    // after that you can use storedDelegate later
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1958880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档