gpt4 book ai didi

c# - 是否可以将任意方法组作为参数传递给方法?

转载 作者:IT王子 更新时间:2023-10-29 04:35:13 37 4
gpt4 key购买 nike

我想写一个像下面这样的函数

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

如果我 promise 签名,那么一切正常。

public void MyFunction(Func<object, object, bool> f)
{
// do something with known delegate
}
...
MyFunction(Object.Equals)

方法组Object.Equals很高兴地被强制转换为已知的委托(delegate)类型 Func<object, object, bool> ,但我不想 promise 特定的签名。我想将任何方法组传递给 MyFunction .

方法组无法转换为 System.Object

public void MyFunction(object o)
{
// do something with o
}
...
MyFunction(Object.Equals) // doesn't work

我认为每个人都忘记了方法调用中的大括号,并在某个时候发现了这一点。我希望这并不意味着方法组不是(或不能转换)为一流对象。

我认为 Linq 表达式不会提供我正在寻找的那种普遍性,但我肯定会遗漏一些东西。

我还应该提一下,如果方法组包含重载就好了,前提是我有办法检查方法组。

我可以用方法组做什么? 我可以打印组中所有方法的所有签名(重载、扩展方法等),或者我可以“调用”带有一些参数的组(如果可能,让它解析为组中的正确重载)。还有其他方法可以执行这些操作,但您可能希望通过方法组来执行这些操作。

正如几个人提到的,我可以接受 Delegate ,并在我调用 MyFunction 时转换为特定的已知委托(delegate)类型.

public void MyFunction(Delegate d)
{
// do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)

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

最佳答案

我认为这里的一个重要问题是:如果你可以通过一个方法组,你会用它做什么?

请记住,方法组只是一组方法的名称 - 可能有一个或多个 - 它们可能是重载或扩展方法。方法组不是保留在编译代码中的概念 - 编译器支持从方法组到委托(delegate)的转换 - 但为了使这成为可能编译器必须能够毫无歧义地解析你打算使用的方法通过。

如果函数明确定义了方法的签名,则方法组仅作为函数的参数有效。因此,例如:public void MyFunction( Func<int> f )可以传递一个方法组。

最接近的方法是编写一个接受委托(delegate)类型的函数:

public void MyFunction( Delegate d ) { ... }

但是你仍然无法将方法组传入,因为没有从方法组到Delegate的转换。您将必须转换为特定的委托(delegate)签名:

// call MyFunction with a particular delegate
MyFunction( (Func<string>)myObj.ToString ); // method group conversion may occur

关于c# - 是否可以将任意方法组作为参数传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1958880/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com