2009-09-23 13 views
21

Tengo una interfaz fluida para un proceso de registro de contenedores de IoC, y esta contiene algunas clases que se utilizan para crear los registros.Ocultando GetHashCode/Equals/ToString de las clases de interfaz fluida intellisense en Visual Studio para C#?

Por ejemplo, puedo hacer esto:

builder.Register<IFoo>().From.ConcreteType<Foo>(); 

Sin embargo, en cada etapa después de un punto, intellisense pops arriba que muestra los cuatro métodos estándar a partir de la clase Object, GetHashCode, iguales, GetType, y ToString.

Intenté sobreescribir estos métodos en algunas de las clases, adjuntando el atributo EditorBrowsableAttribute a cada una de ellas, pero siguen apareciendo. ¿No hay forma de que los oculte?

Tenga en cuenta que no estoy tratando de ocultarlos de la clase en sí, solo de intellisense.

Básicamente, me gustaría esto:

      +---------------+ 
builder.Register<IFoo>().|As    | 
         |By    | 
         |Equals   | <-- remove this 
         |From   | 
         |GetHashCode | <-- and this 
         |GetType  | <-- as well as this 
         |ToString  | <-- and finally this 
         +---------------+ 

Esto es lo que he intentado en la clase que se devuelve desde Register<T>:

[EditorBrowsable(EditorBrowsableState.Never)] 
public override Boolean Equals(Object obj) 
{ 
    return base.Equals(obj); 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public override Int32 GetHashCode() 
{ 
    return base.GetHashCode(); 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public override String ToString() 
{ 
    return base.ToString(); 
} 

Esto claramente no funcionaba. ¿Hay algo más que pueda probar?

También intenté agregar un nuevo método, no reemplazado desde Object, y aplicar el mismo atributo a eso, y eso también aparece, así que claramente el atributo no está haciendo lo que pensé que haría.

Noté la nota en la documentación sobre no ocultar cosas del mismo ensamblaje, pero traté de crear un nuevo proyecto y todavía aparecen allí.

+0

Interesante, la documentación del EditorBrowsableState dice claramente * Por ejemplo, el motor IntelliSense en Visual Studio nunca muestra métodos o propiedades que están marcados como Nunca. * Intenté en un pequeño proyecto de prueba y obtuve los mismos resultados que usted. Incluso si selecciono "Ocultar miembros avanzados" y uso 'EditorBrowsableState.Advanced', el miembro seguirá apareciendo en la lista. Impar. –

+0

Encontré la respuesta, voy a editar la pregunta. –

+0

Buen hallazgo. Nunca no siempre es nunca. –

Respuesta

18

Según thread, es por diseño. Los métodos/propiedades decorados con EditorBrowsable(EditorBrowsableState.Never) solo se ocultan de intellisense si son parte de una clase que se encuentra en otro ensamblaje al que se hace referencia. El montaje no debe ser parte de la misma solución.

21

Ok, encontré la solución, era en parte culpa mía, y en parte documentación incompleta.

Mi error fue que no había etiquetado todos los métodos en la clase correcta, pero incluso cuando los corrigió, los métodos aún aparecían.

Resulta que la nota en la documentación, que dice:

En Visual C#, EditorBrowsableAttribute no suprime los miembros de una clase en el mismo conjunto.

en realidad debería ser (el énfasis es mío):

En Visual C#, EditorBrowsableAttribute no suprime los miembros de una clase en la misma solución abierta.

I etiquetados los métodos de la clase apropiada, hicieron una reconstrucción completa, crearon un nuevo proyecto fuera del archivo de solución, hizo referencias de archivo a los archivos compilados de mi Proyecto de la COI, y he aquí, los métodos desaparecieron .

Dejaré la pregunta en caso de que alguien más tenga este problema.

+0

¡Esto es tan molesto! Por lo general, quiero ocultar las variables que requieren 'lock'ing y exponer una propiedad que hace el bloqueo. Si no puedo hacer esto en la asamblea que estoy desarrollando, ¿cuál es el significado? Si no quisiera utilizar una variable/propiedad/método fuera de un ensamblaje, establecería su acceso a 'private' o' internal'! VB.NET es al menos más sensato en este tema. 'EditorBrowsableState.Never' ** always ** oculta el contenido al que se aplica. –

+1

¿Qué pasa con el método GetType()? ¿Logramos esconderlo? – mynkow

+0

@mynkow Simplemente introduzca el método 'public new Type GetType()' y permita 'return base.GetType();' – tm1

Cuestiones relacionadas