c#传递方法名称作为参数在方法中

问题描述:

我有一个recuring方法,它在我的代码中显示了很多次,它基本上检查以确保连接到odbc是好的,然后连接但每次调用此方法它会调用另一种方法,并且这个主方法的每个实例都是不同的,因为每个方法都是大约8行代码,并且在代码中有8次是不理想的。c#传递方法名称作为参数在方法中

所以基本上我想只有一种方法,我可以调用通过新方法的名称作为一个论据。

所以基本上喜欢:

private void doSomething(methodToBeCalled) { if(somthingistrue) { methodToBeCalled(someArgument) } }

这可能吗?

在此先感谢

您可以使用委托,这很像指向一个功能,你可以通过一个委托的方法,将与参数调用它。

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

这可能吗?

Delegates

+5

我会建议使用在BCL中找到的'Action '委托,而不是定义自定义的委托类型。更少的东西来维护,如果没有别的。 – 2010-06-01 21:24:57

+1

是的,这是一个很好的观点,使用框架中已经完成的所有事情,而不是自定义实现,就像抛出异常一样。很多人都喜欢创建自定义异常 – 2010-06-01 21:26:23

使用委托作为方法的参数,你可以点到任何你想要的方法的委托,提供你坚持你的委托签名。

你也可以使用反射。哪一个更好用(反射与代表)取决于你的代码的其余部分。如果你总是调用采用相同参数的方法,那么委托可能是最合适的。如果您需要调用采用不同参数的方法,那么您可能必须使用反射。看看你的问题,它看起来像你的方法没有参数,所以我会使用前面提到的委托。

+1

您不一定需要反射用参数调用一个函数。您可以解决这个限制,例如使用lambda函数 - 请参阅我的答案。 – stakx 2010-06-01 21:28:57

前面已经说过,您可以使用委托本:

// 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>/etc.参数。如果您希望被调用的方法返回值,请改用Func<T>家族的代理。