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

时间:2010-05-31 19:10:36

标签: visual-studio-2008 filter intellisense class-members

The IHideObjectMembers trick(a.k.a IFluentInterface)可以用于,例如在流畅的界面实现中隐藏IntelliSense的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();
}

我现在应该能够将System.Object成员隐藏在另一种类型中,如下所示:

public class SomeClass : IHideObjectMembers { ... }

或:

public interface ISomeInterface : IHideObjectMembers { ... }

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

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

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

我错过了什么吗?


P.S。:您可以从声明和屏幕截图中推断出我的示例代码。我有一个类SomeClass,它有一个名为SomeMethodTwo的虚拟方法。非常简单。我已经重新实现了此类中的四个System.Object方法,因为这不是必需的。

3 个答案:

答案 0 :(得分:12)

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

  • 需要告知IntelliSense忽略标有EditorBrowsableState等于AdvancedNever的属性。这是通过菜单项工具选项... 文本编辑器 C#→在Visual Studio中实现的→ IntelliSense 隐藏高级会员

  • IHideObjectMembers技巧仅适用于“其他”程序集,并且只有当使用IHideObjectMembers的项目未在同一解决方案中加载时才会起作用。

  • 隐藏object的非静态成员有时在通过IHideObjectMembers接口完成时不起作用,但是当在类中直接显式覆盖方法时它可以正常工作...不幸的是,显示隐藏技术的用处不大。

这些线索的来源:

答案 1 :(得分:7)

如果您不使用

,这个技巧就有效
var x = new SomeClass();

但明确地使用继承自IHideObjectMembers

的接口
ISomeInterface x = new SomeClass();

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

Daniel Cazzulino在其帖子

中明确指出接口
  

我们已经使用流畅的API

中的所有接口完成了这项工作

答案 2 :(得分:4)

此技巧仅在使用引用的DLL中包含的类型时才有效。这些引用的程序集不能是Visual Studio项目引用。如果你自己引用DLL,那么这个技巧应该适合你。