隐藏 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 扩展方法/模块的主要内容,如果未能解决你的问题,请参考以下文章