The IHideObjectMembers
trick (a.k.a IFluentInterface
) can be used e.g. in fluent interface implementations to hide System.Object
members from IntelliSense. (If you don't know this trick, you can read up on it via the above link; I'm just repeating the interface's usual declaration here:)
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();
}
I'm now supposed to be able to hide System.Object
members on another type as follows:
public class SomeClass : IHideObjectMembers { ... }
or:
public interface ISomeInterface : IHideObjectMembers { ... }
I tried this in both VS 2008 Express and VS 2008 Standard. However, no members are hidden from IntelliSense at all. I have used the EditorBrowsableAttribute
in different projects and it always worked well; however, it doesn't work in this particular scenario.
If things had worked as expected, I would only have seen the SomeMethodTwo
method.
Am I missing something?
P.S.: You can infer my example code from the declarations and the screenshot. I have a class SomeClass
with a single dummy method called SomeMethodTwo
. Very simple. I have not re-implemented the four System.Object
methods in this class, as this should not be necessary.
The trick works if you don't use
var x = new SomeClass();
but explicitely use the interface that inherits from IHideObjectMembers
ISomeInterface x = new SomeClass();
var
takes the Type of the concrete class. Thus IntelliSense will look for object.ToString()
and not IHideObjectMembers.ToString()
. The former is not decorated with the EditorBrowsableAttribute
while the later is.
Daniel Cazzulino explicitely refers to interfaces in his post
we’ve done this with all the interfaces in our fluent API