Почему тип этого объекта не показывает интерфейсы через отражение, несмотря на реализацию по крайней мере двух? - PullRequest
10 голосов
/ 02 марта 2010

Во-первых, пример чего-то, что работает как ожидалось: (весь код был выполнен в непосредственном окне VS2008)

25 is IComparable
>> true

25.GetType().GetInterfaces()
>> {System.Type[5]}
>>   [0]: {Name = "IComparable" FullName = ...
>>   [1]: {Name = "IFormattable" FullName = ...
>>   ...

Пока все хорошо. Теперь давайте попробуем создать объект, интерфейс которого наследуется через базовый тип:

class TestBase : IComparable
{
    public int CompareTo(object obj) { throw new NotImplementedException(); }
}

class TheTest : TestBase { }

В ближайшем окне:

(new TheTest()) is IComparable
>> true

(new TheTest()).GetType().GetInterfaces()
>> {System.Type[1]}
>>   [0]: {Name = "IComparable" FullName = "System.IComparable"}

Здесь тоже нет сюрпризов. Почему следующий код не показывает никаких интерфейсов:

wcfChannel = ChannelFactory<IMyServiceApi>.CreateChannel(binding, endpointAddress);

wcfChannel is IMyServiceApi && wcfChannel is ICommunicationObject
>> true

typeof(IMyServiceApi).IsInterface && typeof(ICommunicationObject).IsInterface
>> true

wcfChannel.GetType().GetInterfaces()
>> {System.Type[0]}

Как все вышеперечисленное может быть правдой одновременно?

( edit : добавлено wcfChannel is ICommunicationObject выше, что в настоящее время не объясняется ответом, объясняющим, как wcfChannel is IMyServiceApi соответствует действительности.)

1 Ответ

10 голосов
/ 02 марта 2010

Это потому, что тип wcfChannel - это сам интерфейс:

>> channel.GetType().FullName
"MyService.IMyServiceApi"

>> channel.GetType().IsInterface
true

>> channel.GetType() == typeof(IMyServiceApi)
true

.GetInterfaces() возвращает только интерфейсы , унаследованные или реализованные , но не сам интерфейс.

По общему признанию, это необычно для экземпляра объекта на самом деле иметь тип интерфейса, но, как вы упомянули в своем комментарии к вопросу, объект на самом деле является прозрачным прокси. Для этого прокси имеет смысл быть независимым от фактической реализации интерфейса и заботиться только об интерфейсе. Тот факт, что .GetType() возвращает интерфейс, делает прокси максимально прозрачным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...