Hiding unwanted properties in custom controls

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?


Solution 1:

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).

Solution 2:

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.

Solution 3:

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.