C#中将方法作为参数传递给另一个方法

3
我有一个经常出现在代码中的方法,基本上是检查ODBC连接是否正常并建立连接,但每次调用此方法时,它都会调用另一个方法,并且每个主方法的实例都不同,因为每个方法大约有8行代码,因此在代码中有8个这样的方法并不理想。
因此,我希望只有一个方法,可以通过传递新方法的名称作为参数来调用。
所以基本上像这样: private void doSomething(methodToBeCalled) { if(somthingistrue) { methodToBeCalled(someArgument) } } 这种做法可行吗?
提前感谢。

可能是如何将方法作为参数传递?的重复问题。 - Michael Freidgeim
4个回答

8

正如已经提到的,您可以使用委托来实现此功能:

// as in the original post:
private void doSomething(Action methodToBeCalled)
{
    if (somethingIsTrue)
    {
        methodToBeCalled();
    }
}

对于没有任何参数的方法,可以按照以下方式调用该方法:

private void someMethod()
{
    // ...
}

doSomething(someMethod);

如果您想调用带参数的方法,可以将lambda函数包装在其周围:
private void someMethodWithArgument(int arg)
{
    // ...
}

doSomething( () => someMethodWithArgument(42) );

当然,如果你的方法总是使用相同类型的参数进行调用,你可以声明 doSomething 方法,使其接受一个 Action<T> / Action<T,T> / 等等参数。如果你希望被调用的方法返回一个值,请改用 Func<T> 类型的委托。


3

您可以使用委托,这类似于指向函数的指针,您可以将委托传递给方法,该方法将使用参数调用它。

public delegate void Del(string message);
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
    System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.
handler("Hello World");

在你的情况下
private void doSomething(Del methodToBeCalled) 
{ 
    if(somthingistrue) 
    { 
        methodToBeCalled(someArgument) 
    } 
}

这是可能的吗?

委托


5
建议使用BCL中找到的Action<T>委托,而不是定义自定义委托类型。至少可以减少维护的工作量。 - Fredrik Mörk
1
是的,这是一个很好的观点,应该使用框架中已经完成的所有内容,而不是自定义实现,就像抛出异常一样...很多人喜欢创建自定义异常。 - Svetlozar Angelov

0
使用委托作为您的方法参数,您可以将委托指向任何您想要的方法,只要您遵循您的委托签名即可。

0
你也可以使用反射。使用哪种方法更好(反射 vs. 委托)取决于你代码的其余部分。如果你总是调用需要相同参数的方法,则委托可能是最合适的。如果你需要调用需要不同参数的方法,则可能必须使用反射。从你的问题来看,似乎你的方法不需要参数,所以我会像之前提到的那样使用委托。

1
你不一定需要使用反射来调用带参数的函数。你可以通过使用 lambda 函数等方法绕过这个限制,具体示例请参见我的答案。 - stakx - no longer contributing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接