2014-04-27 33 views
0

我有多種Action委託。採取例如:在單個字段中存儲和調用不同類型的Action對象

Action<float> floatAction; 
Action<string> stringAction; 

我想將它們中的任何一個存儲到一個變量,並能夠稍後調用它。那可能嗎?

SomeSortOfType action = floatAction; 
//or 
SomeSortOfType action = stringAction; 
SomeSortOfType.Invoke(); 

我找不到Action類的基類,所以我對於這種方式是否可行有點無知。

Gr.Viller

回答

1

您可以使用Delegate類,是所有委託類型的基類。

例如:

Action<float> floatAction = (x) => Console.Write(x * 5); 
Action<string> stringAction = Console.WriteLine; 

Delegate d1 = floatAction; 
d1.DynamicInvoke(4.3f); 

d1 = stringAction; 
d1.DynamicInvoke("Hello world"); 
+0

這正是我所期待的,謝謝!用Delegate.DynamicInvoke代替Action.Invoke是否有任何警告,可能有一個原因是它不在那裏。 – Villermen

+0

@Villermen最接近的方法是'DynamicInvoke'。你可以使用'd1.Method.Invoke'調用invoke,但是你需要提供額外的參數。我認爲原因是編譯器沒有關於這個Delegate持有的信息,因此它不能只是推斷類型。所以你在使用'DynamicInvoke'時也要小心,你必須提供正確的參數,否則你不會得到任何編譯時錯誤,但是在運行時它會拋出一個異常 –

+0

所以如果我在一個實際上是Action的Action的代理上調用DynamicInvoke ,它會不會爲它提供參數(某種東西)? – Villermen

1

你可以使用一個Action<dynamic>(或Action<object>與鑄造),如果你創建新的lambda表達式引用您的Action<> S:

Action<float> floatAction = x => Console.WriteLine(x*3); 
Action<string> stringAction = Console.WriteLine; 

Action<dynamic> dyn = o => floatAction(o); 
dyn(1.5f); 
dyn = o => stringAction(o); 
dyn("Hello World!"); 

我想說Selman22的解決方案可能是更好,但我提出這個以防萬一它對你更有用。

相關問題