Вопрос по .net, reflection, methodinfo, c# – Как получить MethodInfo интерфейсного метода, реализовав MethodInfo метода класса?

24

у меня естьMethodInfo изinterface метод иType изclass который реализуетinterface. I want to find the MethodInfo метода класса, который реализует метод интерфейса.

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

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

Ваш Ответ

2   ответа
35

Хорошо, я нашел способ, используя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

Хммм - не уверен насчетcorrect Кстати, но вы можете сделать это, просматривая все интерфейсы вашего типа, а затем ища интерфейсы для метода. Не уверен, что вы можете сделать это напрямую без циклического перебора интерфейсов, так как вы застряли без 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.

Мой пример выше не совпадает по имени, он сопоставляется методом Equals в MethodInfo. Я просто имел в виду, что вам нужно будет дважды проверить, что MethodInfo.Equals по-прежнему считает два экземпляра равными, если они различаются только по имени.
Вы не можете сопоставить по имени. Имена не должны совпадать. Это правило C #, другие языки (VB) позволяют вам называть переопределяющие методы как угодно. Krzysztof Kozmic
Хорошо, извините, но ваш код все еще не делает то, что мне нужно. Это не даст мне класс » Информация о методе - это даст мне интерфейс & apos; Информация о методе. Вы просто утверждаете, что класс реализует интерфейс. Krzysztof Kozmic

Похожие вопросы