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

Posted

技术标签:

【中文标题】VS IntelliSense - IFluentInterface / IHideObjectMembers 技巧不起作用。为啥?【英文标题】: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 (2015, 2017) 中,IHideObjectMembers / IFluentInterface 因 Roslyn 错误而变得无用;见github.com/dotnet/roslyn/issues/4434。 【参考方案1】:

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

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

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

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

这些线索的来源:

exdream.com 上的博客文章 How to keep the Intellisense info box short and tidy

MSDN reference page for System.ComponentModel.EditorBrowsableAttribute

【讨论】:

有趣。我无法使用 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,那么这个技巧应该对你有用。

【讨论】:

以上是关于VS IntelliSense - IFluentInterface / IHideObjectMembers 技巧不起作用。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Intellisense 不适用于 VS2013 中的 JS

Intellisense 提示和 XML 返回注释 (VS2008)

Spdlog 和 VS2019 Intellisense 错误

VS2015提示:未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用。服务器控件的标记Intellisense可能不起作用

在VS2008中使用Qt时,IntelliSense无法正常工作

VS2010 Intellisense 随机禁用自身,安装了 ReSharper