2013-07-23 2 views
2

У меня есть библиотека, написанная на VB.NET, содержащая методы расширения. VB.NET имеет две характеристики, на мой взгляд, противоречат концепции методов расширения:Скрывать методы/модули расширения VB.NET

  • Методы расширения должны быть объявлены в модуле (Extension Methods)
  • Все члены модуля находятся в области видимости пространства имен (Type Promotion)

Это означает, что методы расширения всегда либо доступны на уровне пространства имен, либо вообще недоступны. Это не имеет смысла, поскольку их объем концептуально является типом, который они распространяют, не пространство имен.

Тот факт, что метод объявлен как расширение влияет на его именование, потому что в то время как метод глобального утилита может включать в себя тип, как GetDictionaryValueOrNull, метод расширения может быть просто GetValueOrNull, потому что она должна быть уже ясно, что он объявлен для тип Dictionary. Когда методы расширения являются глобальными, это может сбивать с толку: скажем, что мы находимся в классе (без словаря), который имеет метод GetValue. Если мы наберем «GetValue», Visual Studio перечислит как «GetValue», так и «GetValueOrNull», создавая впечатление, будто текущий класс поддерживает обе операции.

Есть ли какое-либо решение для этого (кроме «написать его в C#»)? Могу ли я пометить модуль как неглобальный или, по крайней мере, заставить Visual Studio отображать только методы расширения , когда они фактически ищут методы расширения?

Предложение в Visual Studio User Voice: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4228049-include-an-option-to-disable-the-promotion-of-scop

ответ

0

Очевидным вариантом было бы переместить методы расширения в определенном пространстве имен, что вы только импорт, когда вы хотите их.

0

Я недавно переехал все мои методы расширения в пространстве имен *.Extensions, где * является то, что пространство имен, что extendee принадлежит. Это работает даже для типов BCL и позволяет мне импортировать только те расширения, которые меня интересуют, а также избегая загроможденного intellisense.

Мое единственное предложение о разграничении функций утилиты и методов расширения заключается в том, чтобы добавить комментарии xml, указывающие, что это метод расширения.

''' <summary>(extension) If the dictionary contains the specified key: return its value; otherwise null.</summary> 
Смежные вопросы