2010-10-27 31 views
7

J'ai une Direction Enum:Est-ce qu'une méthode d'extension est le seul moyen d'ajouter une fonction à un Enum?

Public Enum Direction 
    Left 
    Right 
    Top 
    Bottom 
End Enum 

Et parfois, je dois obtenir l'inverse, il semble donc agréable d'écrire:

SomeDirection.Inverse() 

Mais je ne peux pas mettre une méthode sur un ENUM! Cependant, je peux y ajouter un Extension Method (VS2008 +).

En VB, méthodes d'extension must be inside Modules. Je n'aime vraiment pas beaucoup les modules, et j'essaye d'écrire une classe (modérément) simple que je peux partager dans un seul fichier pour la brancher sur d'autres projets.

Les modules ne peuvent résider que dans le niveau fichier/espace de noms pour que j'ai une dans le bas du fichier maintenant:

Public Class MyClass 
    '...' 
End Class 

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

Il fonctionne, et « si elle est pas cassé, ne le répare pas ", mais j'aimerais savoir si je le fais mal et il y a un meilleur moyen avec moins de passe-partout. Peut-être dans .NET 4? Finalement, je sais que je pourrais écrire une structure qui se comporte comme une énumération, mais cela semble encore plus en arrière.

+1

ce que vous faites est absolument correct. Microsoft propose également la même chose: http://msdn.microsoft.com/en-us/library/bb383974.aspx. – VinayC

+0

Je vois (bonne trouvaille!), Donc ça doit être la bonne façon. Pourtant, je ne vois pas pourquoi nous ne pouvons pas mettre une méthode sur une énumération, il ne semble pas que cela puisse briser quoi que ce soit. –

Répondre

7

C'est en effet le seul moyen d'ajouter (l'apparition de) une méthode à une énumération. Notez qu'en C# la méthode d'extension serait définie sur une classe statique, mais c'est une différence triviale, en grande partie une de nomenclature.

+0

dans VB une classe ne peut pas être déclarée partagée (statique). AFAIK ils sont équivalents aux modules. Mais comme une méthode d'extension n'est que du sucre sintatique pour un statique, je ne comprends pas la nécessité de la placer dans une classe différente (puisqu'une méthode statique peut résider dans une classe non-statique) –

+0

Une méthode * extension * ne peut pas en C#) résident dans une classe non statique, note. –

+0

Je sais que ça ne peut pas, mais je ne comprends pas la raison derrière cela. –

1

Vous pouvez créer une classe qui se comporte comme une énumération, en ce sens qu'elle possède des propriétés static readonly qui renvoient une instance de la classe qui contient cette valeur.

La structure System.Drawing.Color fonctionne par exemple de cette façon (bien que la valeur interne ne soit pas une énumération); il a des propriétés statiques comme Color.Red et Color.White, ainsi que des propriétés d'instance et des méthodes.

+0

Eh bien, ce serait bien plus qu'un simple module, même une classe n'est pas nécessaire pour émuler une énumération - la même chose pourrait être faite dans une structure –

+0

@Camilo Martin: Oui, comme la structure peut aussi être utilisée, mais la raison pour laquelle j'ai suggéré une classe est qu'une structure est plus compliquée à implémenter correctement. Cela peut sembler bizarre d'utiliser une classe intead d'une énumération, mais d'un autre côté, vous obtenez les méthodes dans la classe elle-même au lieu d'utiliser un module séparé – Guffa

+0

Pourquoi compliqué? Le code de cette réponse est simple: http://stackoverflow.com/ questions/1395401/enum-extension-method-todatasource/1395439 # 1395439 –