Является ли метод расширения единственным способом добавить функцию в 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, а также свойства и методы экземпляра.

Другие вопросы по тегам