24

Is this the way to hide properties in derived controls?

public class NewButton : Button

...

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

Also this hides the property in the Properties window in the designer but how can I also hide the property in code?

Joan Venge
  • 315,713
  • 212
  • 479
  • 689

5 Answers5

30

From code, the closest you can do it to hide it, and perhaps make it a pain to call directly - note that even when hidden it is callable, and none of this will work past a cast:

// 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; }

Personally, I wouldn't bother. It isn't robust (just cast).

Joan Venge
  • 315,713
  • 212
  • 479
  • 689
Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
3

You can use the [EditorBrowsable] attribute, as documented here.

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

From the documentation:

...the IntelliSense engine in Visual Studio uses this attribute to determine whether to show a property or method.

However, users can override this in VS settings. ReSharper also has a setting that controls whether this attribute is honoured in its IntelliSense.

Out of curiousity, why do you want to hide something from users? Just because a member is hidden in the way described above doesn't mean you couldn't use it in code and compile it successfully. It just inhibits the discoverability of the member.

Drew Noakes
  • 300,895
  • 165
  • 679
  • 742
  • By hiding I meant to completely "remove" it so you can't access it. It's because some of the properties of Button doesn't apply to my control. – Joan Venge Oct 06 '09 at 22:34
  • Have you considered subclassing a parent of the Button class and reimplementing what you need? I would consider asking a new question that digs into the reason why you need to change the button's behavior and looks for different ways to achieve that. – Drew Noakes Oct 06 '09 at 22:55
1

Maybe what you want to do is derive from ContainerControl or UserControl, add a Button to that control and just expose those parts of the Button interface you want to keep.

Andrew Kennan
  • 13,947
  • 3
  • 24
  • 33
1

No, you can remove them from the designer (as shown) but you cannot really hide them form code as that would violate the substitution principle. It has been asked & answered many times here, see for example this SO question.

Community
  • 1
  • 1
H H
  • 263,252
  • 30
  • 330
  • 514
0

Why don't you make it private? It guarantees that ancestors will not see it. Edit: In this case you have to inherit a new class from the base and use your new class, which now hides ths property.

public class MyTextBox: TextBox
{
...
        private new ContentAlignment TextAlign
        {
          get { return base.ContentAlignment; }
          set { base.ContentAlignment = value; }
        }
}
CLS
  • 571
  • 5
  • 10