2015-07-20 116 views
1

我對我的命令有Dictionary<string, object>。所有的命令都有一個從Cmd類擴展的類。現在我嘗試撥打OnExecute方法,但我收到了ArgumentException反射調用方法 - 參數異常

這是我的函數調用的方法:

public void Execute(string command, string[] args) 
    { 
     try { 
      Type type = commands[command].GetType(); 
      MethodInfo method = type.GetMethod("OnExecute"); 
      method.Invoke(commands[command], args); 
     } 
     catch (ArgumentException ex) 
     { 
      Program.Exception(ex); 
     } catch (TargetException ex) 
     { 
      Program.Exception(ex); 
     } 
    } 

這是我Cmd的類

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Valda.Valda.Command 
{ 
    public class Cmd 
    { 

     public Cmd() 
     { 

     } 

     public void OnExecute(string[] args) 
     { 
      Program.WriteLine(args.ToString()); 
     } 
    } 
} 
+3

嘗試像新對象[] {args}作爲調用的第二個參數。它期望一個代表參數的數組。你想要第一個參數是一個數組。 – dman2306

+0

例外說什麼? – MarcinJuraszek

+0

@ dman2306它的工作!和23.06是我和我女朋友的約會:D –

回答

2

因爲你的方法接受一個參數(OnExecute(string[] args))即是一個字符串數組,你需要string[]類型單元素傳遞陣列到Invoke方法:

method.Invoke(commands[command], new object[] {args}); 
1

Invoke方法接受兩個參數,即具有要調用的方法的實例和表示參數的數組。在你的情況下,你的第一個參數是一個數組。因此,發送給方法的是您的字符串數組的每個成員作爲單獨的參數,而不是作爲第一個參數的數組。你想要的是:

new object[] {args}

這會使你args的第一個參數OnExecute方法。

+0

右半邊。給出的代碼中的第一個參數是調用該方法的類的實例,而不是MethodInfo –

+0

@roger willcocks你是對的。我修好了它。感謝您的更正 – dman2306

2

您必須將參數傳遞爲object[]類型。

所以,必須傳遞參數是這樣的:
method.Invoke(commands[command], new object[] {args});

不喜歡這樣的:
method.Invoke(commands[command], args);

MethodBase.Invoke方法需要一個參數作爲對象陣列(對象[])所以必須使對象數組並將所有參數存儲到數組中。