Как получить MethodInfo интерфейсного метода, реализовав MethodInfo метода класса? - PullRequest
24 голосов
/ 11 июля 2009

У меня есть MethodInfo метода интерфейса и Type класса , который реализует интерфейс . Я хочу найти MethodInfo метода класса, который реализует метод интерфейса.

Простой method.GetBaseDefinition() не работает с интерфейсными методами. Поиск по имени также не будет работать, потому что при явной реализации метода интерфейса он может иметь любое имя (да, не в C #).

Так каков правильный способ сделать это, который охватывает все возможности?

Ответы [ 2 ]

35 голосов
/ 11 июля 2009

ОК, я нашел способ, используя GetInterfaceMap .

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

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

return map.TargetMethods[index];
1 голос
/ 11 июля 2009

Хммм - не уверен насчет правильного правильного способа, но вы можете сделать это, просматривая все интерфейсы вашего типа, а затем ища интерфейсы для метода. Не уверен, что вы можете сделать это напрямую без циклического перебора интерфейсов, так как вы застряли без GetBaseDefinition ().

Для моего интерфейса с одним методом (MyMethod) и моего типа (MyClass), который реализует этот метод, я могу использовать это:

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

Вы должны проверить, что MethodInfo.Equals работает, если два метода имеют разные имена. Я даже не знал, что это возможно, потому что я C # 'er

...