2010-10-27 10 views
7

Ho un senso Enum:Un metodo di estensione è l'unico modo per aggiungere una funzione a un Enum?

Public Enum Direction 
    Left 
    Right 
    Top 
    Bottom 
End Enum 

e qualche volta ho bisogno di ottenere l'inverso, così sembra bello scrivere:

SomeDirection.Inverse() 

ma non posso mettere un metodo su un enum! Tuttavia, posso aggiungere un Extension Method (VS2008 +) ad esso.

In VB, Metodi di estensione must be inside Modules. Non mi piacciono molto i moduli, e sto cercando di scrivere una classe (moderatamente) semplice che possa condividere in un singolo file per essere inserita in altri progetti.

I moduli possono risiedere solo nel livello di file/namespace quindi ho uno nella parte inferiore del file ora:

Public Class MyClass 
    '...' 
End Class 

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

Funziona, e "se non è rotto, non aggiustarlo ", ma mi piacerebbe sapere se sto sbagliando e c'è un modo migliore con meno standard. Forse in .NET 4?

Infine, so che potrei scrivere una struttura che si comporta come un enum, ma sembra ancora più indietro.

+1

quello che stai facendo è assolutamente corretto. Microsoft propone anche la stessa: http://msdn.microsoft.com/en-us/library/bb383974.aspx. – VinayC

+0

Vedo (buona scoperta!), Quindi deve essere la strada giusta. Tuttavia, non vedo perché non possiamo mettere un metodo su un enum, non sembra che rompa nulla. –

risposta

7

Questo è davvero l'unico modo per aggiungere (l'aspetto di) un metodo a un enum.

Si noti che in C# il metodo di estensione sarebbe definito su una classe statica, ma questa è una differenza banale, in gran parte una di nomenclatura.

+0

in VB una classe non può essere dichiarata condivisa (statica). AFAIK sono equivalenti ai moduli. Ma poiché un metodo di estensione è solo zucchero sintattico per uno statico, non capisco la necessità di inserirlo in una classe diversa (poiché un metodo statico può risiedere in una classe non statica) –

+0

Un metodo * estensione * non può (in C#) risiedono in una classe non statica, nota. –

+0

So che non può, ma non capisco la ragione di questo. –

1

È possibile creare una classe che si comporta come un enumerazione, nel senso che ha proprietà readon statiche che restituiscono un'istanza della classe che contiene quel valore.

La struttura System.Drawing.Color, ad esempio, funziona in questo modo (sebbene il valore interno non sia un enum); ha proprietà statiche come Color.Red e Color.White, oltre a proprietà e metodi di istanza.

+0

Beh, sarebbe molto più semplice di un semplice modulo. Anche una classe non è necessaria per emulare un enum - lo stesso potrebbe essere fatto in una struttura Ma sembra davvero strano vedere una struttura che finge di essere un enum. –

+0

@Camilo Martin: Sì, come può essere usata anche la struttura, ma il motivo per cui ho suggerito una classe è che una struttura è più complicata da implementare correttamente. può sembrare strano usare un codice di classe di un enum, ma d'altra parte si ottengono i metodi nella classe stessa invece che in un modulo separato – Guffa

+0

Perché complicato? Il codice di questa risposta sembra semplice: http://stackoverflow.com/ domande/1395401/enum-extension-method-todatasource/1395439 # 1395439 –

Problemi correlati