2010-05-31 10 views
12

The IHideObjectMembers trick (a.k.a IFluentInterface) se pueden utilizar, p. en implementaciones de interfaz fluidas para ocultar System.Object miembros de IntelliSense. (Si usted no sabe este truco, puede leer sobre ella a través del enlace de arriba, yo sólo estoy repitiendo la declaración habitual de la interfaz de aquí :)VS IntelliSense - IFluentInterface/IHideObjectMembers truco no funciona. ¿Por qué?

using System; 
using System.ComponentModel; 

[EditorBrowsable(EditorBrowsableState.Never)] 
public interface IHideObjectMembers 
{ 
    [EditorBrowsable(EditorBrowsableState.Never)] bool Equals(object obj); 
    [EditorBrowsable(EditorBrowsableState.Never)] int GetHashCode(); 
    [EditorBrowsable(EditorBrowsableState.Never)] Type GetType(); 
    [EditorBrowsable(EditorBrowsableState.Never)] string ToString(); 
} 

ahora estoy supone que es capaz de ocultar System.Object miembros en otro tipo de la siguiente manera:

public class SomeClass : IHideObjectMembers { ... } 

o:

public interface ISomeInterface : IHideObjectMembers { ... } 

Probé este tanto en VS 2008 Express y VS 2008 Standard. Sin embargo, ningún miembro está oculto de IntelliSense en absoluto. He usado el EditorBrowsableAttribute en diferentes proyectos y siempre funcionó bien; sin embargo, no funciona en este escenario particular.

http://i48.tinypic.com/vhb4fq.jpg

Si las cosas hubieran funcionado como se esperaba, me habría sólo han visto el método SomeMethodTwo.

¿Echo de menos algo?


P.S .: Usted puede inferir mi código de ejemplo de las declaraciones y la captura de pantalla. Tengo una clase SomeClass con un solo método ficticio llamado SomeMethodTwo. Muy simple. Tengo no reimplementado los cuatro métodos System.Object en esta clase, ya que esto no debería ser necesario.

+0

En las últimas versiones de Visual Studio (2015, 2017) , 'IHideObjectMembers' /' IFluentInterface' se vuelve inútil por un error de Roslyn; ver https://github.com/dotnet/roslyn/issues/4434. – stakx

Respuesta

7

El truco funciona si no se utiliza

var x = new SomeClass(); 

pero explícitamente utiliza la interfaz que hereda de IHideObjectMembers

ISomeInterface x = new SomeClass(); 

var toma el tipo de la clase concreta. Por lo tanto, IntelliSense buscará object.ToString() y no IHideObjectMembers.ToString(). El primero no está decorado con el EditorBrowsableAttribute mientras que el último sí lo está.

Daniel Cazzulino se refiere explícitamente a las interfaces en su puesto

que hemos hecho esto con todas las interfaces en nuestra API fluida

12

Antes de que una solución de trabajo fue publicada (véase más arriba), he investigado y experimentado un poco, y se enteró de esto:

  • IntelliSense necesita ser contada hacer caso omiso de las propiedades marcadas con un EditorBrowsableState igualando Advanced o Never . Esto se logra en Visual Studio a través de la opción de menú Herramientas Opciones ...del editor de textosC#IntelliSenseOcultar miembros avanzados.

  • El truco IHideObjectMembers solo funciona desde "otros" ensamblajes, y solo cuando el proyecto que hace uso de IHideObjectMembers no se carga en la misma solución.

  • Ocultación de los miembros no estáticos de object veces no funciona cuando se hace a través de una interfaz IHideObjectMembers, pero funciona cuando los métodos se reemplazan de forma explícita directamente en la clase ... que por desgracia hace que la técnica que oculta muestra menos útil.

Las fuentes de estas pistas:

+0

Interesante. No he podido hacer que funcione fuera o dentro de la solución utilizando VS 2010. –

+1

+1 puede creer que este es solo el segundo voto a favor de su trabajo. (Tratando de diagnosticar lo mismo en VS10) –

+1

NB no era un problema de VS10: todo lo que cambia es que no se oculta la configuración de miembros avanzados para verificar. Funciona siempre que no sea una referencia de proyecto. Una de las negativas que he notado es que Ctrl., Implementar interfaz explícitamente ahora genera los 4 métodos (aunque solo se ofrece a sí mismo si falta un "método real") pero creo que la vida continuará. (Se aplica lo mismo negativo en VS08) –

4

Este truco solo funciona cuando utiliza tipos que se incluyen en las DLL a las que se hace referencia. Estos ensamblados a los que se hace referencia no pueden ser referencias de proyectos de Visual Studio. Si hace referencia a la DLL, el truco debería funcionar para usted.

Cuestiones relacionadas