Есть ли способ вызвать явно реализованный метод / свойство через отражение в .NET? - PullRequest
13 голосов
/ 04 июля 2011

Мне нужно иметь возможность определить, происходит ли данный метод или свойство от определенного интерфейса и явно ли оно реализовано .
Кто-нибудь делал это и возможно ли получить эту информацию с помощью .NET-отражения?


Обновление

Как видно из комментариев ниже принятого ответа, я пытаюсь добиться метода, который реализует особый интерфейс с помощью отражения. Поскольку существует возможность иметь несколько интерфейсов с одной и той же сигнатурой метода, я хотел определить правильную реализацию для вызова на основе интерфейса. В моем сценарии тип реализации, интерфейс и имя метода определяются во время выполнения, поэтому я не могу использовать простое приведение в моем случае.

Ответы [ 2 ]

16 голосов
/ 04 июля 2011

Явно реализованные методы интерфейса в C # являются частными в целевом классе. Вы можете использовать этот факт и создать этот метод расширения, чтобы возвращать только эти методы:

static IEnumerable<MethodInfo> GetExplicitlyImplementedMethods(this Type targetType, 
    Type interfaceType) 
{ 
  return targetType.GetInterfaceMap(interfaceType).TargetMethods.Where(m => m.IsPrivate);
}

Примечание: только для C # .

ОБНОВЛЕНИЕ: Но, исходя из ваших требований, кажется, что вы хотите знать только, какие методы реализуют какие методы интерфейса, не заботясь о том, является ли реализация неявной или явной. Тогда для решения, которое работает на разных языках, этого будет достаточно:

static IEnumerable<MethodInfo> GetImplementedMethods(this Type targetType,
    Type interfaceType) 
{ 
  return targetType.GetInterfaceMap(interfaceType).TargetMethods;
}
1 голос
/ 11 августа 2014

Если при использовании отражения метод является закрытым и его имя содержит символ., Например «System.IDisposable.Dispose», то это явная реализация.

...