2009-07-11 5 views
23

은 내가 인터페이스 방법의 MethodInfo인터페이스를 구현하는 클래스Type 있습니다. interface 메서드를 구현하는 클래스 메서드 인 MethodInfo을 찾고 싶습니다.MethodInfo 메서드를 가져 오는 방법, 메서드 MethodInfo를 구현하는 중?

단순한 method.GetBaseDefinition()은 인터페이스 메소드에서 작동하지 않습니다. 명시 적으로 인터페이스 메소드를 구현할 때 어떤 이름 (예 : C#이 아니라도)을 가질 수 있기 때문에 이름 별 조회는 작동하지 않습니다.

그래서 은 무엇이겠습니까? 모든 방법을 다룰 수있는 방법은 무엇입니까?

답변

33

OK, 나는 GetInterfaceMap을 사용하여 길을 발견했다.

var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType); 
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod); 

if (index == -1) 
{ 
    //this should be literally impossible 
} 

return map.TargetMethods[index]; 
1

흠 - 확실하지 않다면 올바른 방법 일지 모르지만 유형의 모든 인터페이스를 루핑 한 다음 인터페이스에 대한 메소드를 검색하면됩니다. 당신이 GetBaseDefinition()없이 막히는 것처럼 인터페이스를 반복하지 않고 직접 할 수 있는지 확실하지 않습니다. MethodInfo.Equals이 경우 작동하는지 확인하기 위해

MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod"); 
MethodInfo classMethodInfo = null; 
Type[] interfaces = typeof(MyClass).GetInterfaces(); 

foreach (Type iface in interfaces) 
{ 
    MethodInfo[] methods = iface.GetMethods(); 

    foreach (MethodInfo method in methods) 
    { 
     if (method.Equals(interfaceMethodInfo)) 
     { 
      classMethodInfo = method; 
      break; 
     } 
    } 
} 

당신이 한 것 :이 사용할 수있는이 방법을 구현하는 하나의 방법 (MyMethod라는) 내 유형 (MyClass에) 내 인터페이스의

두 가지 메소드는 서로 다른 이름을 가지고있다. 나는 그것이 가능하다는 것을 몰랐다. 아마도 나는 C#이다.

+0

이름으로 검색 할 수 없습니다. 이름은 일치 할 필요가 없습니다. 그것은 C# 규칙, 다른 언어 (VB)를 사용하면 원하는대로 재정의하는 메서드의 이름을 지정할 수 있습니다. –

+0

위의 샘플이 이름과 일치하지 않으며 MethodInfo의 Equals 메서드와 일치합니다. 그저 MethodInfo.Equals가 이름 만 다를 경우 여전히 두 인스턴스가 같은 것으로 간주하는지 다시 확인해야한다는 의미였습니다. –

+0

죄송하지만 코드에서 여전히 필요한 것을 수행하지 못합니다. 그것은 나에게 클래스 '메소드 정보를주지 않을 것이다 - 그것은 나에게 인터페이스'메소드 정보를 줄 것이다. 클래스가 인터페이스를 구현한다고 단언합니다. –

관련 문제