2014-12-05 4 views
1

리플렉션을 사용하여 어떻게 varargs 메서드를 호출 할 수 있습니까?varargs 메서드 호출

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 메소드의 경우, 유형은 Object의 배열입니다. –

+0

@Max 1)'GetMethod (string, Type [])'은 고정 된 매개 변수 유형 만 검사하며 vararg 유형을 기반으로 메소드를 생성하지 않습니다. 2) 메소드에 객체를 전달하지 않기 때문에 오히려 빈 Type 배열이됩니다. – IllidanS4

답변

3

RuntimeMethodInfo 때문에 단순히 (명시 적으로 확인하고 메소드의 호출 규칙이 VarArgs 경우 발생)이 지원되지 않습니다, 당신은 정기적 Object[] 걸리는 방법을 호출하기위한 IL를 생성하는 래퍼를 작성해야, 그것을 호출합니다. ILGenerator을 지원하며 varargs-methods는 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