2014-12-05 41 views
1

我如何可以調用使用反射一個可變參數的方法?像這樣的:調用可變參數方法

public static void ArgsMethod(__arglist) 
{ 
    ArgIterator ai = new ArgIterator(__arglist); 
    while(ai.GetRemainingCount() > 0) 
    { 
     Console.WriteLine(TypedReference.ToObject(ai.GetNextArg())); 
    } 
} 

typeof(Program).GetMethod("ArgsMethod").Invoke(null,new object[0])拋出NotSupportedException異常

+0

我懷疑你需要'TypedReference'。 – SLaks 2014-12-05 16:05:36

+0

調用傳遞方法名稱和方法參數類型數組的GetMethod。對於可變參數方法,類型是一個Object數組。 – 2014-12-05 16:06:38

+0

@Max 1)'GetMethod(字符串,類型[])'僅檢查固定的參數類型,它不創建基於可變參數類型的方法。 2)它寧願是一個空的Type數組,因爲我不會傳遞任何對象給方法。 – IllidanS4 2014-12-05 16:14:31

回答

3

由於RuntimeMethodInfo根本不支持這一(它明確地檢查並拋出,如果該方法的調用約定VarArgs),你必須寫一個包裝,把一個正Object[],調用該方法生成IL,並調用它。 ILGenerator確實支持可變參數的方法,通過EmitCall。 MSDN甚至有足夠的幫助有a sample that demonstrates this exact scenario

當然,這並不完全是方便,但然後沒有關於可變參數是真的。

2

我不知道這是你想要的東西,但是這個工作對我來說;

class Program 
    { 
     public static void ArgsMethod(params object[] args) 
     { 
      foreach (var par in args) 
      { 
       Console.WriteLine("variable has type: " + par.GetType()); 

      } 
     } 

     static void Main(string[] args) 
     { 
      Type[] types = new Type[1]; 
      types[0] = typeof(object[]); 
      MethodInfo m = typeof(Program).GetMethod("ArgsMethod", types); 
      object[] parameters = new Object[1]; 
      parameters[0] = args; 
      m.Invoke(null, parameters); 
     } 
    } 

params不是__arglist同樣的事情,但如果你在下發展C#中的方法,可以更好地使用PARAMS。

請參閱http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx

+0

'__arglist'不是'params'。 – IllidanS4 2014-12-05 16:50:46