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
方法,因为这不是必需的。
答案 0 :(得分:12)
在发布工作解决方案之前(见上文),我进行了一些研究和实验,并发现了这一点:
需要告知IntelliSense忽略标有EditorBrowsableState
等于Advanced
或Never
的属性。这是通过菜单项工具→选项... →文本编辑器→ 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,那么这个技巧应该适合你。