C # usando i numeri in un enum

Speriamo che sia un po ‘sbrigativo.

Questo è un enum valido

public enum myEnum { a= 1, b= 2, c= 3, d= 4, e= 5, f= 6, g= 7, h= 0xff }; 

Ma questo non è

 public enum myEnum { 1a = 1, 2a = 2, 3a = 3, }; 

C’è un modo in cui posso usare un numero in un enum. Ho già il codice per popolare i menu a discesa da enumerazione, quindi sarebbe abbastanza utile

Nessun identificativo in C # può iniziare con un numero (per ragioni lessicali / di analisi). Considera di aggiungere un attributo [Descrizione] ai tuoi valori enum:

 public enum myEnum { [Description("1A")] OneA = 1, [Description("2A")] TwoA = 2, [Description("3A")] ThreeA = 3, }; 

Quindi puoi ottenere la descrizione da un valore enum come questo:

 ((DescriptionAttribute)Attribute.GetCustomAttribute( typeof(myEnum).GetFields(BindingFlags.Public | BindingFlags.Static) .Single(x => (myEnum)x.GetValue(null) == enumValue), typeof(DescriptionAttribute))).Description 

Sulla base del commento di XSA di seguito, ho voluto approfondire come rendere questo più leggibile. Molto semplicemente, puoi semplicemente creare un metodo statico (estensione):

 public static string GetDescription(this Enum value) { return ((DescriptionAttribute)Attribute.GetCustomAttribute( value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static) .Single(x => x.GetValue(null).Equals(value)), typeof(DescriptionAttribute)))?.Description ?? value.ToString(); } 

Spetta a te decidere se vuoi renderlo un metodo di estensione e, nell’implementazione di cui sopra, l’ho fatto rientrare nel nome normale dell’enumerazione se non è stato fornito [DescriptionAttribute] .

Ora puoi ottenere la descrizione per un valore enum tramite:

 myEnum.OneA.GetDescription() 

No, non c’è. C # non consente agli identificatori di iniziare con una cifra.

Nota sull’usabilità dell’applicazione: nella tua applicazione non dovresti comunque mostrare identificatori di codice all’utente finale. Pensa a tradurre singoli elementi di enumerazione in testi visualizzabili di facile utilizzo. Prima o poi dovrai estendere l’enum con un object il cui identificatore non sarà in una forma visualizzabile dall’utente.

AGGIORNAMENTO: si noti che il modo per albind testi visualizzabili agli elementi di enumerazione viene discusso, ad esempio, qui .

Un identificatore in C # (e la maggior parte delle lingue) non può iniziare con una cifra.

Se puoi modificare il codice che popola un menu a discesa con i nomi di enumerazione, potresti avere un trucco che toglie il segno di sottolineatura principale quando compili il menu a discesa e definisci l’enumerazione in questo modo:

 public enum myEnum { _1a = 1, _2a = 2, _3a = 3 }; 

Oppure, se non ti piacciono i caratteri di sottolineatura, potresti creare il tuo schema ‘prefisso-da-essere-spogliato’ (magari passa il prefisso al costruttore o al metodo che popolerà il menu a discesa dall’enumerazione).

Non c’è modo. Un identificatore valido (ovvero un membro di enumerazione valido) non può iniziare con una cifra.

Le enumerazioni non sono diverse dalle variabili in termini di regole di denominazione. Pertanto, non è ansible iniziare il nome con un numero. Da questo post , ecco le regole principali per la denominazione delle variabili.

  • Il nome può contenere lettere, cifre e il carattere di sottolineatura (_).

    • Il primo carattere del nome deve essere una lettera. Il carattere di sottolineatura è anche un primo carattere legale, ma il suo uso non è raccomandato all’inizio di un nome. Un trattino basso viene spesso utilizzato con comandi speciali e talvolta è difficile da leggere.

    • Il caso conta (cioè lettere maiuscole e minuscole). C # è sensibile al maiuscolo / minuscolo; quindi, il conteggio dei nomi e il conteggio si riferiscono a due diverse variabili.

    • Le parole chiave C # non possono essere utilizzate come nomi di variabili. Ricorda che una parola chiave è una parola che fa parte del linguaggio C #. (Un elenco completo delle parole chiave C # può essere trovato nell’appendice B, “Parole chiave C #.”)

Gli identificatori non possono iniziare con i numeri. Tuttavia, possono contenere numeri.

Ecco cosa mi è venuto in mente come alternativa, in cui avevo bisogno di Enum da utilizzare in un ciclo “for” e una rappresentazione di stringa equivalente a quella di una query Linq.

  1. Crea lo spazio dei nomi enum da utilizzare in “for” Loop.
 public enum TrayLevelCodes { None, _5DGS, _5DG, _3DGS, _3DG, _AADC, _ADC, _MAAD, _MADC }; 
  1. Crea stringhe basate su enum create per essere utilizzate per la query di Linq
 public string _5DGS = "\"5DGS\"", _5DG = "\"5DG\"", _3DGS = "\"3DGS\"", _3DG = "\"3DG\"", _AADC = "\"AADC\"", _ADC = "\"ADC\"", _MAAD = "\"MAAD\"", _MADC = "\"MADC\""; 
  1. Crea una funzione che assumerà un valore enum come argomento e restituirà la stringa corrispondente per la query Linq.
 public string GetCntnrLvlDscptn(TrayLevelCodes enumCode) { string sCode = ""; switch (enumCode) { case TrayLevelCodes._5DGS: sCode = "\"5DGS\""; break; case TrayLevelCodes._5DG: sCode = "\"5DG\""; break; case TrayLevelCodes._3DGS: sCode = "\"3DGS\""; break; case TrayLevelCodes._3DG: sCode = "\"3DG\""; break; case TrayLevelCodes._AADC: sCode = "\"AADC\""; break; case TrayLevelCodes._ADC: sCode = "\"AAC\""; break; case TrayLevelCodes._MAAD: sCode = "\"MAAD\""; break; case TrayLevelCodes._MADC: sCode = "\"MADC\""; break; default: sCode = ""; break; } return sCode; } 
  1. Ecco come sto usando ciò che ho creato sopra.
 for (var trayLevelCode = TrayLevelCodes._5DGS; trayLevelCode <= TrayLevelCodes._MADC; trayLevelCode++) { var TrayLvLst = (from i in pair1.Value.AutoMap where (i.TrayLevelCode == HTMLINFO.GetCntnrLvlDscptn(trayLevelCode)) orderby i.TrayZip, i.GroupZip group i by i.TrayZip into subTrayLvl select subTrayLvl).ToList(); foreach (DropShipRecord tray in TrayLvLst) { } }