Является ли метод расширения единственным способом добавить функцию в Enum? - PullRequest
8 голосов
/ 27 октября 2010

У меня есть направление 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 ]

7 голосов
/ 27 октября 2010

Это действительно единственный способ добавить (появление) метода в перечисление.

Обратите внимание, что в C # метод расширения будет определен для статического класса, но это тривиальное различие, в значительной степени одно из номенклатуры.

1 голос
/ 27 октября 2010

Вы можете создать класс, который ведет себя как перечисление, в том смысле, что он имеет статические свойства только для чтения, которые возвращают экземпляр класса, который содержит это значение.

Например, структура System.Drawing.Color работает такпуть (хотя внутреннее значение не перечисление);он имеет статические свойства, такие как Color.Red и Color.White, а также свойства и методы экземпляра.

...