VS IntelliSense - IFluentInterface/IHideObjectMembers技巧不起作用.为什么?

sta*_*ica 12 intellisense filter visual-studio-2008 class-members

IHideObjectMembers特技(又名IFluentInterface)可用于例如,在连贯接口实现隐藏System.Object从智能感知构件.(如果你不知道这个技巧,你可以通过上面的链接阅读它;我只是在这里重复界面的通常声明:)

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();
}
Run Code Online (Sandbox Code Playgroud)

我现在应该能够隐藏System.Object其他类型的成员,如下所示:

public class SomeClass : IHideObjectMembers { ... }
Run Code Online (Sandbox Code Playgroud)

要么:

public interface ISomeInterface : IHideObjectMembers { ... }
Run Code Online (Sandbox Code Playgroud)

我在VS 2008 Express和VS 2008 Standard中都试过这个.但是,根本没有成员隐藏IntelliSense.我已经EditorBrowsableAttribute在不同的项目中使用它,它总是运作良好; 但是,它在这种特定情况下不起作用.

http://i48.tinypic.com/vhb4fq.jpg

如果事情按预期发挥作用,我只会看到这种SomeMethodTwo方法.

我错过了什么吗?


PS:您可以从声明和屏幕截图中推断出我的示例代码.我有一个SomeClass叫做单个虚拟方法的类SomeMethodTwo.非常简单.我没有System.Object在这个类中重新实现这四个方法,因为这不是必需的.

sta*_*ica 12

在发布工作解决方案之前(见上文),我进行了一些研究和实验,并发现了这一点:

  • 需要告知IntelliSense忽略用EditorBrowsableState等于Advanced或标记的属性Never.这是通过菜单项工具选项...文本编辑器C#智能感知隐藏高级成员在Visual Studio中实现的.

  • IHideObjectMembers技巧仅适用于"其他"程序集,并且只有在使用的项目IHideObjectMembers未加载到同一解决方案中时才有效.

  • 隐藏非静态成员object有时在通过IHideObjectMembers接口完成时不起作用,但是当在类中直接显式覆盖方法时它会起作用...不幸的是,显示的隐藏技术不那么有用.

这些线索的来源:


Seb*_*ber 7

如果你不使用,这个技巧是有效的

var x = new SomeClass();
Run Code Online (Sandbox Code Playgroud)

但明确地使用继承自的接口 IHideObjectMembers

ISomeInterface x = new SomeClass();
Run Code Online (Sandbox Code Playgroud)

var获取具体类的类型.因此,IntelliSense将寻找object.ToString()而不是寻找IHideObjectMembers.ToString().前者不是用后者装饰的EditorBrowsableAttribute.

Daniel Cazzulino明确地指出了帖子中的界面

我们使用流畅的API中的所有接口完成了这项工作