12

IHideObjectMembers技巧(又名IFluentInterface)可用于例如流畅的接口实现中以隐藏System.ObjectIntelliSense 的成员。(如果你不知道这个技巧,你可以通过上面的链接阅读它;我只是在这里重复接口的通常声明:)

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在不同的项目中使用过它,它总是运行良好;但是,它在这种特定情况下不起作用。

如果事情按预期进行,我只会看到该SomeMethodTwo方法。

我错过了什么吗?


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

4

3 回答 3

12

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

  • 需要告知 IntelliSense 忽略标有EditorBrowsableState等号Advanced或的属性Never。这在 Visual Studio 中通过菜单项ToolsOptions...Text editorC#IntelliSenseHide advanced members来实现。

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

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

这些线索的来源:

于 2010-08-24T21:15:27.877 回答
7

如果你不使用这个技巧就有效

var x = new SomeClass();

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

ISomeInterface x = new SomeClass();

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

Daniel Cazzulino在他的帖子中明确提到了接口

我们已经使用 fluent API 中的所有接口完成了这项工作

于 2012-02-17T15:50:53.190 回答
4

This trick only works when you are using types that are included in referenced DLLs. These referenced assemblies cannot be Visual Studio project references. If you reference the DLL themselves, then the trick should work for you.

于 2011-04-23T02:24:54.920 回答