2009-05-28 1 views
7

특정 속성을 가진 메소드를 호출하려고합니다. 그래서 모든 어셈블리와 모든 메서드를 순환하여 내 특성을 가진 메서드를 찾습니다. 잘 작동하지만 MethodInfo 만 가져 왔을 때 특정 메서드를 호출하는 방법은 무엇입니까?MethodInfo에 의한 메소드 호출

AppDomain app = AppDomain.CurrentDomain; 
Assembly[] ass = app.GetAssemblies(); 
Type[] types; 
foreach (Assembly a in ass) 
{ 
    types = a.GetTypes(); 
    foreach (Type t in types) 
    { 
     MethodInfo[] methods = t.GetMethods(); 
     foreach (MethodInfo method in methods) 
     { 
      // Invoke a certain method 
     } 
    } 
} 

문제는 특정 방법이 포함 된 클래스의 인스턴스를 모른다는 것입니다. 메서드가 정적이 아니기 때문에 제대로 호출 할 수 없습니다. 가능하면이 클래스의 새 인스턴스를 만드는 것을 피하기를 원합니다.

답변

5

이 문제 정의보다는 코딩의 관점에서 문제로 저를 친다 다음과 같이 당신이 정적 할 수없는 가정

당신이 필요로하는 코드입니다.

인스턴스 메서드는 호출되는 인스턴스에 따라 달라집니다. 인스턴스 메서드를 호출하지 않고 인스턴스 메서드를 호출하는 것은 의미가 없습니다. 마틴 (Martin)이 말했듯이, 어떤 인스턴스가 호출되는지는 신경 쓰지 않는 인스턴스 메소드는 거의 항상 정적이어야한다. 내가 생각할 수있는 유일한 즉각적인 예외는 인스턴스가 사용할 구현을 암시 적으로 지정하는 가상 메소드이다.

실제 결과물 은 주석이 달린 인스턴스 메소드가 있기 때문에 컨텍스트에서을 의미합니다. 왜 어쨌든 메소드를 호출하려고합니까? 더 큰 그림은 무엇입니까? 당신은 어떤 맥락입니까? 나는 당신이 콘텍스트의 어떤 개념을 원할 것이라고 강력히 의심한다. - 이 인스턴스 메소드를 호출 할 수있는 객체의 모음.

+0

내가 원하는 것은 메소드를 커맨드 라인에 의해 호출 가능하도록 커스텀 속성으로 표시하는 것이다. 그들이 어디에 있든 상관 없습니다. 하지만 정적 인 메소드가 아닌 서버 인스턴스에서 동일한 메소드를 호출하는 것은 의미가 없다는 것에 동의합니다. 그래서 매개 변수마다 특정 인스턴스에 대한 호출을 호출하는 이러한 객체의 컬렉션을 포함하는 일종의 관리자 클래스에서이를 사용합니다. 나는 이것이 내가 원하는 것을 할 것이라고 생각한다. 감사 – apparat

11

비 정적 메서드는 인스턴스에 따라 다르므로 클래스를 인스턴스화하여 메서드를 호출해야합니다. 코드가 정의 된 곳에서 코드를 변경할 수 있고 메소드가 인스턴스의 일부가 될 필요가 없다면 (클래스 내부의 비 정적 속성이나 메소드를 액세스하거나 수정하지 않음) 모범 사례는 어쨌든 메소드를 정적으로 만들 수 있습니다.

foreach (Type t in types) 
    { 
      object instance = Activator.CreateInstance(t); 

      MethodInfo[] methods = t.GetMethods(); 
      foreach (MethodInfo method in methods) 
      {      
       method.Invoke(instance, params...);  
      } 
    } 
+0

실제로; 비 정적 메소드는 ** 인스턴스 **에만 해당됩니다. 정적 메소드는 클래스에 따라 다릅니다. – Kris

+0

와우. 수정 됨 - 감사합니다. –

0

사실, 당신이해야 할 일은 기존 개체의 목록을 만든 다음 목록을 검색하는 것입니다. 그래서 당신이 invokable 객체들을 생성 할 때 그것들을리스트에 저장하게 될 것입니다 (또는리스트는 invokable 객체에 대한 설명을 가진 다른 종류의 객체 목록이어야합니다). 그런 다음 런타임에 목록을 스캔하여 처리중인 이벤트 유형과 일치하는 항목을 찾은 다음 methodInfo를 조회하고 메소드 정보에서 .Invoke를 호출 할 수 있습니다. 또한 적절한 인수를 전달해야하지만, 올바른 유형의 객체 벡터를 만들어이를 수행 할 수 있습니다.