【问题标题】:VS IntelliSense - IFluentInterface / IHideObjectMembers trick does not work. Why?VS IntelliSense - IFluentInterface / IHideObjectMembers 技巧不起作用。为什么?
【发布时间】:2010-05-31 19:10:35
【问题描述】:

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,它一直运行良好;但是,它在这种特定情况下不起作用。

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

我错过了什么吗?


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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

这些线索的来源:

【讨论】:

  • 有趣。我无法使用 VS 2010 使其在解决方案的外部或内部工作。
  • +1 可以相信这只是对您作品的第二次投票。 (尝试在 VS10 上诊断相同)
  • NB 不是 VS10 的问题——它所改变的只是没有隐藏高级成员设置来检查。只要它不是项目参考,它就可以工作。我注意到的一个负面因素是 Ctrl., implementation interface 现在显式生成 4 种方法(但它仅在缺少“真实方法”时才提供)但我想生活会继续。 (同样的否定适用于 VS08)
【解决方案2】:

如果你不使用,这个技巧会起作用

var x = new SomeClass();

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

ISomeInterface x = new SomeClass();

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-17
      • 1970-01-01
      • 2020-06-06
      • 2013-02-22
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多