Как обнаружить, что метод в классе C # реализует метод из интерфейса? - PullRequest
2 голосов
/ 08 мая 2019

Я хочу использовать рефлексию, чтобы сказать, что реализация метода GetName в SomClassImpl происходит из интерфейса IHasName.Например:

public interface IHasName
{
    string GetName();
}

public interface IOtherInterface
{
    //...elided...
}

public class MyClass : IHasName, IOtherInterface
{
    /*
     * I want to use reflection to know this 
     * implements IHasName.GetName()
     */
    public string GetName()
    {
        return "me";
    }
}

Возможно ли это?

Когда я попробовал typeof(MyClass).GetMethod("GetName").GetBaseDefinition().DeclaringType и typeof(MyClass).GetMethod("GetName").DeclaringType, они оба возвращают реализующий класс, не интерфейс.

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Я вижу две возможности вашего сценария:

  1. Класс реализует интерфейс
  2. Класс наследует класс, который реализует интерфейс

В первом случае typeof(Foo).GetMethod("GetName", BindingFlags.Public | BindingFlags.Instance | BindiFoongFlags.DeclaredOnly) возвращает информацию о методе.

В последнем случае typeof(Bar).GetMethod("GetName", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) возвращает null.

См. пример здесь .

1 голос
/ 08 мая 2019

Далее будет указано, реализует ли объект интерфейс:

unkObj is IHasName

Это будет также, если использовать отражение от типа вместо объекта:

typeof(IHasName).IsAssignableFrom(typeof(MyClass))

Это получит метод, связанный с интерфейсом, и вызовет его с любым типом, который реализует интерфейс, с вызовом связанного метода в его классе:

MethodInfo methodIHasName = typeof(IHasName).GetMethod("GetName", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
string name = methodIHasName.Invoke(unkObj, new object[0]);

Если вам абсолютно необходимо получить MethodInfo из MyClass и все, что у вас есть, это MethodInfo интерфейса IHasName, вы можете отобразить интерфейс следующим образом: (Спасибо @Aleeev Levenkov за ссылка)

var map = typeof(MyClass).GetInterfaceMap(methodIHasName.DeclaringType);
var index = Array.IndexOf(map.InterfaceMethods, methodIHasName);
return map.TargetMethods[index];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...