2016-11-06 40 views
0

我是新的C#和它看起來我需要使用Dictionary<string, Action> 所以我寫了下面的代碼:調用操作參考

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    {  
     var functions = new Dictionary<string, Action<string[]>>(); 
     functions.Add("Foo", CountParameters); 
     functions.Add("Bar", SomeOtherMethodName); 

     Console.WriteLine("Hello World"); 

     Action<string[]> action; 
     if (functions.TryGetValue("Foo", out action)) 
     { 
      action(); 
      // What shall I write here to invoke the action!? 
     } 
     else 
     { 
      // No function with that name 
     }    
    } 

    public static void CountParameters(string[] args) 
    { 
     Console.WriteLine("Fn 1"); 
    } 

    public static void SomeOtherMethodName(string[] args) 
    { 
     Console.WriteLine("Fn 2"); 
    } 
} 

我的問題是兩個部分:

  1. 如果條件成立,我應該如何調用Action
  2. 我理解ActionFuncvoid回報,但看起來輸入args是必須的,在我的情況,我沒有一個input args也不是output所以是Action我需要什麼,或者可能是別的東西?
+0

1.以任何方式調用它?例如:'action(new string [] {「」});' - 2.如果它是'Func'則必須有返回類型。如果它是一個Action,它沒有返回類型。兩者都可以有你定義的輸入參數(最多16個我認爲)。這包括*零*輸入參數。爲什麼當他們不需要它時,將這些操作/方法定義爲需要輸入參數'string []'? – Corak

回答

2

如果所有的方法都沒有返回值,那麼Action<string[]>就可以。如果他們甚至不需要參數,則可以簡單地使用非通用的Action -delegate並省略string[]-參數。

var functions = new Dictionary<string, Action>(); 
functions.Add("Foo", CountParameters); 
... 

關於調用:如果你離開了(不要)string[] -parameter你已經在你的代碼片段做了它的方式是罰款。只需調用像你已經做了從字典中所採取的Action -delegate不帶任何參數:action();

而不是附加()你可以可以致電action.Invoke();的括號。

+0

我不知道爲什麼你添加了最後一次編輯,實際上'Action if(functions.TryGetValue(「Foo」,out action))'不起作用,並在'action'給了我一個錯誤,而以前的解決方案'Action action ; \t \t if(functions.TryGetValue(「Foo」,out action))'完美地工作。 –

+1

對不起,這可能是一個誤會。只需使用「行動」而不是「行動」。 – khlr