2010-06-01 116 views
2

我有一個recuring方法,它在我的代碼中顯示了很多次,它基本上檢查以確保連接到odbc是好的,然後連接但每次調用此方法它會調用另一種方法,並且這個主方法的每個實例都是不同的,因爲每個方法都是大約8行代碼,並且在代碼中有8次是不理想的。c#傳遞方法名稱作爲參數在方法中

所以基本上我想只有一種方法,我可以調用通過新方法的名稱作爲一個論據。

所以基本上喜歡:

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

這可能嗎?

在此先感謝

回答

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

這可能嗎?

Delegates

+5

我會建議使用在BCL中找到的'Action '委託,而不是定義自定義的委託類型。更少的東西來維護,如果沒有別的。 – 2010-06-01 21:24:57

+1

是的,這是一個很好的觀點,使用框架中已經完成的所有事情,而不是自定義實現,就像拋出異常一樣。很多人都喜歡創建自定義異常 – 2010-06-01 21:26:23

0

使用委託作爲方法的參數,你可以點到任何你想要的方法的委託,提供你堅持你的委託簽名。

0

你也可以使用反射。哪一個更好用(反射與代表)取決於你的代碼的其餘部分。如果你總是調用採用相同參數的方法,那麼委託可能是最合適的。如果您需要調用採用不同參數的方法,那麼您可能必須使用反射。看看你的問題,它看起來像你的方法沒有參數,所以我會使用前面提到的委託。

+1

您不一定需要反射用參數調用一個函數。您可以解決這個限制,例如使用lambda函數 - 請參閱我的答案。 – stakx 2010-06-01 21:28:57

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