2009-07-11 13 views
23

mam MethodInfo o interfejsu sposób i Type z klasy realizującym interfejs. Chcę znaleźć MethodInfo metody klasy, która implementuje metody interfejsu.Jak uzyskać MethodInfo metody interfejsu, po wdrożeniu metody MethodInfo klasy?

prostego method.GetBaseDefinition() nie działa z metod interfejsu. wyszukiwania według nazwy nie będzie działać albo, ponieważ podczas wdrażania metody interfejsu jawnie może mieć dowolną nazwę (tak, nie w C#).

Co to jest prawidłowy sposób, który obejmuje wszystkie możliwości?

Odpowiedz

33

OK, znalazłem sposób, używając 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

Hmmm - nie jestem pewien co do sposobu poprawnego, ale można to zrobić, przechodząc przez wszystkie interfejsy danego typu, a następnie przeszukując interfejsy dla metody. Nie wiem, czy można to zrobić bezpośrednio bez zapętlenie poprzez interfejsy, jak jesteś trochę zatrzymany bez GetBaseDefinition().

Dla mojego interfejs z jednej metody (myMethod) i mojego typu (MojaKlasa), który implementuje tej metody można użyć tego:

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; 
     } 
    } 
} 

Trzeba by sprawdzić, czy działa, jeśli MethodInfo.Equals dwie metody mają różne nazwy. Ja nawet nie wiem, że było to możliwe, prawdopodobnie cos Jestem C# 'er

+0

Nie można dopasować według nazwy. Nazwy nie muszą się zgadzać. Jest to reguła C#, inne języki (VB) pozwalają nadpisywać nadrzędne metody, jakie tylko chcesz. –

+0

Moja próbka powyżej nie jest zgodne z nazwy, to jest dopasowanie metodą równych na MethodInfo. Chciałem tylko sprawdzić, czy metoda MethodInfo.Equals nadal uważa dwa wystąpienia za równe, jeśli różnią się tylko nazwą. –

+0

Dobra, przepraszam, ale twój kod nadal nie spełnia moich oczekiwań. Nie dostarczy mi informacji o metodzie klas - dostarczy mi informacji o metodzie interfejsu. Po prostu twierdzisz, że klasa implementuje interfejs. –

Powiązane problemy