Ocultar propiedades no deseadas en controles personalizados

¿Es esta la manera de ocultar propiedades en controles derivados?

public class NewButton : Button

 [Browsable ( false )] public new ContentAlignment TextAlign { get; set; } 

También esto oculta la propiedad en la ventana Propiedades del diseñador, pero ¿cómo puedo también ocultar la propiedad en el código?

Desde el código, lo más cerca que puede hacerlo para ocultarlo, y tal vez sea difícil llamar directamente: tenga en cuenta que incluso cuando está oculto, se puede llamar, y nada de esto funcionará más allá de un molde:

 // about the closest you can do, but not really an answer [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] [Obsolete("just cast me to avoid all this hiding...", true)] public new ContentAlignment TextAlign { get; set; } 

Personalmente, no me molestaría. No es robusto (solo lanzado).

Puede usar el atributo [EditorBrowsable] , como se documenta aquí .

 [EditorBrowsable(EditorBrowsableState.Never)] public bool HideMeInIntellisense { // ... 

De la documentación:

… el motor IntelliSense en Visual Studio usa este atributo para determinar si se muestra una propiedad o método.

Sin embargo, los usuarios pueden anular esto en la configuración de VS. ReSharper también tiene una configuración que controla si este atributo se respeta en su IntelliSense.

Por curiosidad, ¿por qué quieres ocultar algo a los usuarios? El hecho de que un miembro esté oculto de la manera descrita anteriormente no significa que no pueda usarlo en el código y comstackrlo correctamente. Solo inhibe la capacidad de descubrimiento del miembro.

No, puedes eliminarlos del diseñador (como se muestra), pero no puedes ocultarlos realmente porque eso violaría el principio de sustitución. Se ha preguntado y respondido muchas veces aquí, vea por ejemplo esta pregunta SO .

Tal vez lo que desea hacer es derivar de ContainerControl o UserControl, agregar un botón a ese control y simplemente exponer las partes de la interfaz del botón que desea conservar.

¿Por qué no lo haces en privado? Garantiza que los antepasados ​​no lo verán. Editar: en este caso, debe heredar una nueva clase de la base y usar su nueva clase, que ahora oculta esa propiedad.

 public class MyTextBox: TextBox { ... private new ContentAlignment TextAlign { get { return base.ContentAlignment; } set { base.ContentAlignment = value; } } }