2012-12-05 19 views
14

È possibile combinare più enumerazioni insieme? Di seguito è riportato il codice di esempio di quello che io vorrei vedere:Combina enum multipli in elenco enum principale

enum PrimaryColors 
{ 
    Red, 
    Yellow, 
    Blue 
} 

enum SecondaryColors 
{ 
    Orange, 
    Green, 
    Purple 
} 

//Combine them into a new enum somehow to result in: 
enum AllColors 
{ 
    Red, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

Non importa quale ordine che sono, o che cosa i loro numeri sono backing, voglio solo essere in grado di combinarli.

Per il contesto, è così che più classi per un programma su cui sto lavorando avrebbero enumerazioni associate a ciò che fanno. Il mio programma principale avrebbe letto tutte le enumerazioni disponibili da ciascuna delle classi di supporto e avrebbe creato un elenco principale delle enumerazioni disponibili dei comandi disponibili (le enumerazioni sono per).

Modifica: Il motivo di queste enumerazioni è dovuto al fatto che il mio programma principale sta leggendo in un elenco di comandi da eseguire in determinati momenti e quindi voglio leggere nel file, vedere se il comando in esso è associato a uno delle mie enumerazioni, e se lo è, mettilo in una lista di comandi da eseguire.

+2

'enum' è fondamentalmente un concetto di compilazione. Stai cercando di produrre un file C# che contiene una definizione di qualcosa di simile a 'AllColors', o stai cercando di fare qualcos'altro? – dasblinkenlight

+0

Stai cercando di creare il tipo combinato "AllColors" a livello di codice, cioè non lo creo finché l'applicazione non è in esecuzione? Se vuoi semplicemente aggiungerli in una lista, ricorda che tutte le enumerazioni hanno 'System.Object' e' System.Enum' come loro classi base. Potresti creare un elenco basato su una di queste classi. I tuoi valori enumerati sarebbero incassati, ovviamente, ma probabilmente non è un problema. –

+1

Perché limitarti a "enumerare"? –

risposta

3

Non sono sicuro di aver capito bene. Ma si può fare un List<> di tutti i valori di questo tipo:

var allColors = new List<Enum>(); 

allColors.AddRange(Enum.GetValues(typeof(PrimaryColors)).Cast<Enum>()); 
allColors.AddRange(Enum.GetValues(typeof(SecondaryColors)).Cast<Enum>()); 

Invece di List<Enum> si potrebbe anche usare HashSet<Enum>. In ogni caso, poiché assegni un PrimaryColor o SecondaryColor a un tipo classe (ovvero System.Enum), ottieni boxing, ma questo è solo un dettaglio tecnico (probabilmente).

+0

BTW, 'HashSet' molto probabilmente non ha senso qui come ottimizzazione delle prestazioni. Ma potrebbe avere senso se lo stai usando per rendere più chiaro l'intento. – svick

+0

Questo codice non sembra funzionare quando ho provato. In un programma di esempio basato su questo, ho ricevuto gli errori: 'La migliore corrispondenza metodo sovrapposta per 'System.Collections.Generic.List .AddRange (System.Collections.Generic.IEnumerable )' ha alcuni argomenti non validi' e' Argomento 1: impossibile convertire da 'System.Collections.Generic.IEnumerable ' a 'System.Collections.Generic.IEnumerable ' ' – Xantham

+0

@Xantham Spiacente, ho modificato la mia risposta di nuovo. –

6

La ragione di queste enumerazioni è perché il mio programma principale è la lettura in un elenco di comandi da eseguire in certi momenti, e così ho voglia di leggere nel file, vedere se il comando in esso è associato ad uno dei le mie enumerazioni, e se lo è, mettilo in una lista di comandi da eseguire.

Questo mi sembra non si vuole tre diversi tipi enum, si vuole un tipo (quello che si chiama “master enum”) più un modo per decidere quale dei sub-enumerazioni un certo valore appartiene. Per fare ciò, è possibile utilizzare una raccolta di valori dall'enumerazione principale o uno switch.

Ad esempio:

enum Color 
{ 
    Red, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

bool IsPrimaryColor(Color color) 
{ 
    switch (color) 
    { 
    case Color.Red: 
    case Color.Yellow: 
    case Color.Blue: 
     return true; 
    default: 
     return false; 
    } 
} 

Inoltre, you should use a singular name for enum types (a meno che non si tratta di una bandiera enum).

1

mantenerlo semplice e basta usare impliciti int conversioni, oppure usa la funzione System.Enum.Parse():

enum PrimaryColors 
{   
    Red = 0, 
    Yellow = 2, 
    Blue = 4 
} 

enum SecondaryColors 
{ 
    Orange = 1, 
    Green = 3, 
    Purple = 5 
} 

//Combine them into a new enum somehow to result in: 
enum AllColors 
{ 
    Red = 0, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

class Program 
{ 
    static AllColors ParseColor(Enum color) 
    { 
     return ParseColor(color.ToString()); 
    } 
    static AllColors ParseColor(string color) 
    { 
     return (AllColors)Enum.Parse(typeof(AllColors), color); 
    } 
    static void Main(string[] args) 
    { 
     PrimaryColors color1=PrimaryColors.Red; 
     AllColors result=(AllColors)color1; 
     // AllColors.Red 

     SecondaryColors color2=SecondaryColors.Green; 
     AllColors other=(AllColors)color2; 
     // AllColors.Green 

     AllColors final=ParseColor(PrimaryColors.Yellow); 
     // AllColors.Yellow 
    } 
}