2012-07-17 2 views
2

리플렉션을 사용하여 메소드를 호출하려고합니다. 이 같은MethodInfo.Invoke 매개 변수 순서

뭔가 :

method.Invoke(instance, propValues.ToArray()) 

문제는 매개 변수의 배열을 보장하는 방법이 올바른 순서로되어되지 않는 것입니다. 어떤 값이 어떤 매개 변수에 이름을 붙여야하는지에 대한 구체적인 방법이 있습니까? 아니면 정말로 맞춤 바인더를 만들어야합니까? 그렇다면 누군가 올바른 방향으로 나를 안내 할 수 있습니까?

답변

7

어떤 값이 어떤 매개 변수에 이름으로 지정 될지 구체적인 방법이 있습니까?

음, 매개 변수 순서로 지정하십시오. 특정 값을 특정 이름으로 매핑하려면 method.GetParameters으로 매개 변수 목록을 가져 와서 그런 식으로 매핑해야합니다. 예를 들어, 당신은 매개 변수로 Dictionary<string, object>을했다 :

var arguments = method.GetParameters() 
         .Select(p => dictionary[p.Name]) 
         .ToArray(); 
method.Invoke(instance, arguments); 
+0

ASP.NET MVC 프레임 워크와 관련된 몇 가지 복잡한 문제로 인해 사용할 수 없습니다. 그러나,이 100 % 질문에 대답했다. 감사! – Pluc

+0

이 방법을 시도했지만 "주어진 키가 사전에 없습니다"라는 메시지가 계속 나타납니다. 내가 무엇이 누락 되었습니까? – Jacques

+0

@Jacques : 자네가 사전에 지정하지 않은 매개 변수가 있다는 것을 제안 할 것이다 ... –

0

편집 :이 대답은 매개 변수 유형이 아닌 매개 변수 이름에 초점을 맞추고 있습니다. 코드가 혼란 스럽거나 매개 변수 이름이 다른 경우 Jon Skeet이 제공 한 솔루션을 매핑하기가 어려울 수 있습니다.

어쨌든, 나는이 많은 연주했다 .... 이것은 (PARAM 이름을 모르는 상태에서) 나를 위해 잘 작동하는 무슨이다 : 그래서

public object CallMethod(string method, params object[] args) 
    { 
     object result = null; 

     // lines below answers your question, you must determine the types of 
     // your parameters so that the exact method is invoked. That is a must! 
     Type[] types = new Type[args.Length]; 
     for (int i = 0; i < types.Length; i++) 
     { 
      if (args[i] != null) 
       types[i] = args[i].GetType(); 
     } 

     MethodInfo _method = this.GetType().GetMethod(method, types); 

     if (_method != null) 
     { 
      try 
      { 
       _method.Invoke(this, args); 
      } 
      catch (Exception ex) 
      { 
       // instead of throwing exception, you can do some work to return your special return value 

       throw ex; 
      } 
     } 

     return result; 

    } 

, 위의 함수를 호출 할 수 있습니다 :

public int MyMethodName(int a, string b, char c) { 
    return 1000; 
} 

참고 :

object o = CallMethod("MyMethodName", 10, "hello", 'a'); 

위의 호출은 일치하는 서명이 메소드를 호출 할 수 있어야합니다 위의 예제가 'this'의 범위에 있습니다.

+1

같은 유형의 매개 변수가 여러 개있는 경우에도 계속 깨질 수 있습니다 ... –

+0

동일한 유형이 있어도 올바른 방법이 호출됩니다. 날 믿어, 너는 시도해야 해. – KMX

+0

답변을 다시 읽었을 때, 질문의 요점을 완전히 놓쳤다 고 생각합니다. 당신이 준 예제는 올바른 순서로 인수를가집니다. OP의 전체적인 문제는 인수 *가 반드시 올바른 순서가 아니어야한다는 것입니다. 그는 이미 올바른 방법을 가지고 있지만 매개 변수와 일치하도록 인수를 전달하는 방법을 알지 못합니다. –