2010-03-02 6 views
10

En primer lugar, un ejemplo de algo que funciona como se espera: (todo el código fue ejecutado en VS2008 ventana inmediata)¿Por qué el tipo de este objeto no muestra interfaces a través de la reflexión, a pesar de implementar al menos dos?

25 is IComparable 
>> true 

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

Hasta aquí todo bien. Ahora vamos a tratar sobre un objeto en la interfaz se hereda a través de un tipo base:

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

class TheTest : TestBase { } 

En la ventana inmediata:

(new TheTest()) is IComparable 
>> true 

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

No hay sorpresas aquí tampoco. ¿Cómo es que el siguiente código no muestra ninguna interfaz a continuación:

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

¿Cómo puede todo lo anterior sea cierto al mismo tiempo?

(edición: añadido wcfChannel is ICommunicationObject arriba, que es en este momento no explicada por la respuesta que explica cómo wcfChannel is IMyServiceApi es cierto.)

+0

presumiblemente un efecto secundario del hecho de que este tipo se genera en tiempo de ejecución; por curiosidad, ¿es un ContextBoundObject? –

+0

Más información: Visual Studio lo muestra como 'System.Runtime.Remoting.Proxies .__ TransparentProxy'. No se puede ver ContextBoundObject en ningún lado. –

Respuesta

10

es porque el tipo de wcfChannel es la propia interfaz:

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

>> channel.GetType().IsInterface 
true 

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

.GetInterfaces() devuelve solo las interfaces heredadas o implementadas, pero no la interfaz en sí.

Es cierto que es inusual que una instancia de objeto sea realmente de un tipo de interfaz, pero como mencionó en su comentario sobre la pregunta, el objeto es en realidad un proxy transparente. Tiene sentido que ese proxy sea independiente de la implementación de la interfaz real y solo se preocupe por la interfaz. El hecho de que .GetType() devuelva la interfaz hace que el proxy sea lo más transparente posible.

+1

¡Excelente hallazgo! –

+0

Gracias! ------- – Timwi

+0

Desafío número dos: ¿cómo es posible que 'channel is ICommunicationObject' también sea' true'? :) Me doy cuenta ahora de que todo esto es el resultado de que "channel" es un objeto .NET Remoting, pero ¿Reflection expone el hecho de que 'channel' implementa' ICommunicationObject' de alguna manera? –

Cuestiones relacionadas