2010-10-27 7 views
7

que tienen una dirección de enumeración:¿Es un método de extensión la única forma de agregar una función a un Enum?

Public Enum Direction 
    Left 
    Right 
    Top 
    Bottom 
End Enum 

Y a veces necesito para obtener la inversa, por lo que parece bien escribir:

SomeDirection.Inverse() 

pero no puedo poner un método en una enumeración! Sin embargo, puedo agregarle un Extension Method (VS2008 +).

En VB, Métodos de extensión must be inside Modules. Realmente no me gustan mucho los módulos, y estoy tratando de escribir una clase (moderadamente) simple que pueda compartir en un solo archivo para ser conectada a otros proyectos.

módulos sólo pueden residir en el nivel de archivo/espacio de nombres, así que tengo una en la parte inferior del archivo ahora:

Public Class MyClass 
    '...' 
End Class 

Public Module Extensions 
    <Extension()> _ 
    Public Function Inverse(ByVal dir As Direction) As Direction 
     '...' 
    End Function 
End Module 

Funciona, y "si no está roto, no lo arregles ", pero me encantaría saber si lo estoy haciendo mal y hay una mejor manera con menos repetitivo. ¿Tal vez en .NET 4?

Finalmente, sé que podría escribir una estructura que se comporta como una enumeración, pero que parece incluso más al revés.

+1

lo que estás haciendo es absolutamente correcto. Microsoft también propone lo mismo: http://msdn.microsoft.com/en-us/library/bb383974.aspx. – VinayC

+0

Veo (¡buen descubrimiento!), Así que debe ser el camino correcto. Aún así, no veo por qué no podemos poner un método en una enumeración, no parece que rompa nada. –

Respuesta

7

Esa es de hecho la única manera de agregar (la apariencia de) un método a una enumeración.

Tenga en cuenta que en C# el método de extensión se definiría en una clase estática, pero esa es una diferencia trivial, principalmente una de nomenclatura.

+0

en VB una clase no se puede declarar compartida (estática). AFAIK son equivalentes a módulos. Pero como un método de extensión es solo azúcares sintácticos para uno estático, no entiendo la necesidad de ponerlo en una clase diferente (ya que un método estático puede residir en una clase no estática) –

+0

Un método de * extensión * no puede (en C#) residen en una clase no estática, nota. –

+0

Sé que no puede, pero no entiendo la razón detrás de esto. –

1

Puede crear una clase que se comporte como una enumeración, en el sentido de que tiene propiedades de solo lectura estáticas que devuelven una instancia de la clase que contiene ese valor.

La estructura System.Drawing.Color funciona, por ejemplo, de esta manera (aunque el valor interno no es una enumeración); tiene propiedades estáticas como Color.Red y Color.White, así como propiedades y métodos de instancia.

+0

Bueno, eso sería mucho más repetitivo que un módulo Incluso una clase no es necesario para emular una enumeración - el mismo podría hacerse en una estructura . pero lo que realmente se ve raro ver una estructura que pretende ser una enumeración –

+0

@Camilo Martin: Sí., como estructura también se puede utilizar, pero la razón por la que me sugirió una clase es que una estructura es más complicado de implementar correctamente. Puede parecer extraño usar un intead de clase de una enumeración, pero, por otro lado, obtienes los métodos en la misma clase en lugar de hacerlo en un módulo separado. – Guffa

+0

¿Por qué complicado? El código de esta respuesta parece simple: http://stackoverflow.com/ preguntas/1395401/enumeración, la extensión y método de todatasource/1395439 # 1395439 –

Cuestiones relacionadas