2014-05-04 73 views
0

如何在Action委託中傳遞未知類型的參數?傳遞未知類型的參數

Button b1 = new Button("HI!", Class.method); 
班上

Action doAction; 
string text; 

public Button(string Message, Action func) 
    { 
     text = Message; 
     doAction = func; 
    } 

public void Clicked() 
    { 
     doAction(); 
    } 

我要實現的是添加一個按鈕時,我可以傳遞參數的功能:

Button b2 = new Button("HI!", Class.method(unknown_parameter)); 

感謝。

編輯:我聽說Action<T>東西,但它真的不清楚。

+5

根據您的需要,可以使用'Object','dynamic'或'generics'類型。 – walther

回答

0

Class.method(unknown_parameter)中的圓括號會嘗試調用該函數,因此您無法傳遞這樣的參數。相反,您必須傳遞參數,並在該函數內執行該方法。

你能做到這一點,例如使用泛型:

class Button<T> 
{ 
    public Button (string message, Action<T> func, T param) 
    { 
     func(param); // calls the method 
    } 
} 

new Button<string>("foo", Class.method, "bar"); 

你也可以通過在調用該方法lambda表達式:在所有

class Button 
{ 
    public Button (string message, Action func) 
    { 
     func(); // calls the function 
    } 
} 

new Button("foo",() => Class.method("bar")); 
+0

謝謝。 你的第二個解決方案似乎是更好的選擇。 – sabjut

0

如果你不知道什麼類型將是,您可以使用「動作<對象>」在這種情況下代碼將如下所示:

public Button(string Message, Action<object> func) 
{ 
    text = Message; 
    doAction = func; 
} 

public void Clicked(object o) 
{ 
    doAction(o); 
} 

但是......挑戰將是如何處理「doAction」中的未知類型。圍繞這個問題有各種各樣的方法,但要真正能夠推薦做什麼,我想我們需要看一些未知參數來自哪裏的例子。通常我們有一些想法可能的類型正在做什麼。