隐藏 VB.NET 扩展方法/模块

Posted

技术标签:

【中文标题】隐藏 VB.NET 扩展方法/模块【英文标题】:Hiding VB.NET extension methods / modules 【发布时间】:2013-07-23 01:37:20 【问题描述】:

我有一个用 VB.NET 编写的包含扩展方法的库。 VB.NET 有两个特征在我看来与扩展方法的概念不一致:

扩展方法必须在模块中声明 (Extension Methods) 所有模块成员都在命名空间范围内 (Type Promotion)

这意味着扩展方法总是可以在命名空间级别访问,或者根本无法访问。这没有意义,因为它们的范围在概念上是它们扩展的类型,而不是命名空间。

将方法声明为扩展这一事实会影响其命名,因为虽然全局实用方法可能包含类型,例如 GetDictionaryValueOrNull,但扩展方法可以简单地为 GetValueOrNull,因为它应该已经很清楚了为Dictionary 类型声明。当扩展方法是全局的时,这可能会令人困惑:假设我们在一个(非字典)类中,它有一个 GetValue 方法。如果我们键入“GetValue”,Visual Studio 将同时列出“GetValue”和“GetValueOrNull”,使当前类看起来好像支持这两种操作。

是否有任何解决方案(除了“用 C# 编写”)?我可以将模块标记为非全局模块,或者至少强制 Visual Studio 仅显示扩展方法它们实际上被查找为扩展方法?

Visual Studio 用户之声的建议:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4228049-include-an-option-to-disable-the-promotion-of-scop

【问题讨论】:

【参考方案1】:

显而易见的选择是将扩展方法移动到特定的命名空间中,只有在需要时才导入。

【讨论】:

【参考方案2】:

我最近将我所有的扩展方法移到了命名空间*.Extensions,其中*extendee 所属的任何命名空间。这甚至适用于 BCL 类型,并且允许我只导入我感兴趣的扩展,同时还避免了混乱的智能感知。

我对区分实用程序函数和扩展方法的唯一建议是添加 xml cmets 表明它是扩展方法。

''' <summary>(extension) If the dictionary contains the specified key: return its value; otherwise null.</summary>

【讨论】:

以上是关于隐藏 VB.NET 扩展方法/模块的主要内容,如果未能解决你的问题,请参考以下文章

C# 到 VB.Net:为啥转换为 VB 时编译失败?

MVC2 扩展方法在我的视图中引发错误

在 VB.NET 中使用带有匿名方法的 LINQ 的 ForEach

VB.Net 扩展对象 IExtenderProvider

VB.NET显示程序的进度,该怎么做?

使用VB.NET的五个技巧之窗体嵌套