我有一个recuring方法,它在我的代码中多次显示它基本上检查以确保与odbc的连接是正确然后连接但每次调用此方法时它调用另一个方法和main的每个实例方法这一个是不同的,因为每个方法大约有8行代码,在代码中有8次是不理想的。
所以基本上我想只有一个方法,我可以调用新方法的名称作为争论。
所以基本上就像:
private void doSomething(methodToBeCalled)
{
if(somthingistrue)
{
methodToBeCalled(someArgument)
}
}
这可能吗?
提前致谢
答案 0 :(得分: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>
系列中的委托。
答案 1 :(得分: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)
}
}
这可能吗?
答案 2 :(得分:0)
使用Delegates作为方法参数,您可以将委托指向您想要的任何方法,只要您坚持代理签名即可。
答案 3 :(得分:0)
您也可以使用反射。哪一个更好用(反射与委托)取决于你的其余代码。如果您总是调用采用相同参数的方法,那么委托可能是最合适的。如果需要调用采用不同参数的方法,则可能必须使用反射。看看你的问题,看起来你的方法没有参数,所以我会使用前面提到的委托。