2014-12-05 2 views
1

Как я могу вызвать метод varargs с использованием отражения? Как это:Invoke varargs method

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

+0

Вызвать метод GetMethod, передающий имя метода и массив типов параметров вашего метода. Для метода varargs тип представляет собой массив объекта. –

+0

@Max 1) 'GetMethod (string, Type [])' проверяет только фиксированные типы параметров, он не создает метод, основанный на типах vararg. 2) Это скорее пустой массив Type, поскольку я не передаю никакие объекты методу. – IllidanS4

ответ

3

RuntimeMethodInfo Так просто не поддерживает это (он явно проверяет и бросает, если соглашение о вызове метода является VarArgs), вы должны написать оболочку, которая принимает регулярное Object[], генерирует IL для вызова метода, и вызывает это. ILGeneratorделает поддерживает varargs-методы через EmitCall. MSDN даже достаточно полезен, чтобы иметь a sample that demonstrates this exact scenario.

Конечно, это не совсем удобный, но тогда ничего о varargs, действительно.

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

Смежные вопросы