2013-04-10 101 views
7

我需要能夠通過任意方法的一些功能myFunction如何將任意方法(或委託)作爲參數傳遞給函數?

void myFunction(AnyFunc func) { ... } 

應該可以與其他靜態的,例如,公共或私有方法,甚至委託執行它:

myFunction(SomeClass.PublicStaticMethod); 
myFunction(SomeObject.PrivateInstanceMethod); 
myFunction(delegate(int x) { return 5*x; }); 

通過的方法可能有任何數量的參數和任何返回類型。還應該可以通過反射來了解myFunction中的實際參數數量及其類型。 myFunction定義中的AnyFunc將如何適應這些要求?可以接受myFunction的幾個重載版本。

+0

如果它有參數,您希望傳遞給該方法的內容是什麼?這聽起來像你應該將任何方法轉換爲無參數/無效返回(又名'Action'),然後再傳遞給此方法。 – Servy 2013-04-10 16:25:02

+0

'myFunction'將分析該函數的參數,根據某個外部數據庫檢查它們,並用必要的值調用它,否則將失敗,如果沒有找到數據庫中的匹配條目。 – 2013-04-10 16:26:40

+0

這是一個*非常*令人擔憂的設計,其中你基本上把代碼當作數據來對待。你應該考慮重新設計這樣的代碼是靜態的。 – Servy 2013-04-10 16:27:32

回答

6

Delegate類型是所有其他委託類型的超類型:

void myFunction(Delegate func) { ... } 

然後,func.Method會給你一個MethodInfo可用於檢查返回類型和參數類型的對象。

當調用函數你必須明確地指定要創建哪些類型的委託:

myFunction((Func<int, int>) delegate (int x) { return 5 * x; }); 

的你想在更高層次上實現將是一件好事什麼了,因爲這方法可能並不理想。

+0

我想盡可能簡化調用網站,並隱藏圖書館內的細節。任何方式來指定'myFunction',以便用戶不需要轉換他們的委託? – 2013-04-10 16:28:01

+1

@SergiyByelozyorov調用站點不能做得更簡單,因爲編譯器需要* some *具體的委託類型來創建一個實例。如果你想接受「任何委託類型」,那麼調用者*必須*自己指定一個委託類型。(例如,給定匿名委託'delegate(){}',['Action'](http://msdn.microsoft.com/en-us/library/system.action.aspx)和['ThreadStart' ](http://msdn.microsoft.com/en-us/library/system.threading.threadstart.aspx)兼容委託類型 - 編譯器如何知道要創建哪個?) – cdhowie 2013-04-10 16:29:32

+0

謝謝。我想那是我的答案。這是不可能的。謝謝。 – 2013-04-10 16:32:17

0

有方法接受一個Delegate,而不是特定的委託:

void myFunction(Delegate func) 
{ 

} 
+0

就像在cdhowie的回答中一樣,它需要將委託轉換爲特定的委託類型或Func <...>。我想避免這種情況。 – 2013-04-10 16:29:00

+0

@SergiyByelozyorov正如他告訴你的,這是不可能的。 – Servy 2013-04-10 16:31:24

相關問題