如何防止提供扩展方法的公共类出现在Intellisense中?

4

有没有什么方法可以在Intellisense中“隐藏”一个类的名称,而该类唯一的目的是提供扩展方法?

我想从Intellisense列表中删除类名,但需要该类的扩展方法以通常的方式通过Intellisense对外部程序集可用。


对于一个好问题点赞;System.Web.*提供了它们自己的StringExtensions,但在Intellisense中它总是被识别为模糊的名称。虽然不会影响任何功能,但我不喜欢在任何地方看到红色感叹号。 - Dan Lugg
4个回答

3

我希望您可以使用EditorBrowsable属性来完成此操作:

[EditorBrowsable(EditorBrowsableState.Never)]
static class MyExtensions { }

不幸的是,这似乎没有起作用。


2

好的,我有这个答案。Hallgrim的建议是用...标记类。

[EditorBrowsable(EditorBrowsableState.Never)]

实际上是可行的,但只有在引用 程序集 而不是项目时才有效。这种情况发生在我自己的 VS 解决方案中编写提供类的程序集时。扩展方法像往常一样可用。


2
显然,VB智能感知不会显示带有[EditorBrowsable(EditorBrowsableState.Never)]的类中定义的扩展方法。 - Max Toro

1
你的意思是要隐藏类,还是扩展方法?
如果你将静态类放在它自己的命名空间中,那么任何没有使用 using 指令导入该命名空间的代码都无法“看到”扩展方法。

1
隐藏类 - 我不希望用户看到提供方法的类的类名 - 但是这些方法应该像往常一样运行(即在Intellisense中针对适当的支持类型可用)- 这有意义吗? - flesh
有点类似,但我觉得你不太可能实现它。如果他们能看到这个类,真的是个问题吗?我记不清智能感知是否会显示扩展方法的来源,但如果确实会的话,作为用户,看到一个我无法找到任何迹象的类名,我会感到惊讶。 - Jon Skeet
1
不,这不是一个很大的问题,但我提供汇编作为一种实用工具,并希望它尽可能地用户友好。我不担心用户在使用扩展方法时看到提供类名 - 我只是不希望他们尝试做“SupplyingClass obj = new ...”。 - flesh
如果它是一个静态类(必须是这样才能包含扩展方法),他们无论如何都做不到 - 编译器会阻止他们。让类名指示用途,例如“SupplyingClassExtensions”,然后就很明显了。 - Jon Skeet

0
如果你把扩展方法放入一个模块中,那么有一个名为 HideModuleName 的属性可以隐藏模块名称,使其不会在 Intellisense 中显示出来。

1
我认为你指的是Microsoft.VisualBasic.HideModuleName - 它非常适用于VB模块(在VB项目中),但不适用于C#静态类 :( - AndrewD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接