Является ли метод расширения единственным способом добавить функцию в Enum?
У меня есть направление Enum:
Public Enum Direction
Left
Right
Top
Bottom
End Enum
И иногда мне нужно получить обратное, поэтому, кажется, приятно написать:
SomeDirection.Inverse()
Но я не могу поместить метод в перечисление! Тем не менее, я могу добавить метод расширения (VS2008+) к нему.
В VB методы расширения должны быть внутри модулей. Мне действительно не очень нравятся модули, и я пытаюсь написать (умеренно) простой класс, которым я могу поделиться в одном файле для подключения к другим проектам.
Модули могут находиться только на уровне файла / пространства имен, поэтому у меня есть один в нижней части файла сейчас:
Public Class MyClass
'...'
End Class
Public Module Extensions
<Extension()> _
Public Function Inverse(ByVal dir As Direction) As Direction
'...'
End Function
End Module
Это работает, и "если это не сломано, не чините это", но я хотел бы знать, делаю ли я это неправильно, и есть лучший способ с меньшим количеством шаблонов. Может быть, в.NET 4?
Наконец, я знаю, что мог бы написать структуру, которая ведет себя как перечисление, но это кажется еще более задом наперед.
2 ответа
Это действительно единственный способ добавить (появление) метода в перечисление.
Обратите внимание, что в C# метод расширения будет определен для статического класса, но это тривиальное отличие, в основном одно из номенклатуры.
Вы можете создать класс, который ведет себя как перечисление, в том смысле, что он имеет статические свойства только для чтения, которые возвращают экземпляр класса, который содержит это значение.
System.Drawing.Color
структура, например, работает таким образом (хотя внутреннее значение не является перечислением); имеет статические свойства, такие как Color.Red
а также Color.White
, а также свойства и методы экземпляра.