Enum sono molto utili. Uno dei problemi degli Enum in .NET è la mancanza di supporto per stringhe. Infatti questi possono essere solamente di tipo numerico.
Vediamo come aggiungere il supporto delle stringhe agli Enum. L’idea è di utilizzare un “Extension Methods” per aggiungere alla classe Enum il metodo GetStrOfEnumMemberAtt e per enumerare i valori con le stringhe utilizziamo la classe EnumMember.
La seguente classe contiene “Extension Methods” che poi utilizzeremmo per accedere alla stringa. Vorrei fare notare, che questa classe utilizza un oggetto Dictionary
public static class EnumExtensions { //cache private static Dictionary<Enum, string> _stringValues = new Dictionary<Enum, string>(); public static string GetStrOfEnumMemberAtt(this Enum value) { if (!_stringValues.ContainsKey(value)) { //Add to cache Type type = value.GetType(); FieldInfo fi = type.GetField(value.ToString()); EnumMemberAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumMemberAttribute), false) as EnumMemberAttribute[]; if (attrs.Length > 0 && !string.IsNullOrEmpty(attrs[0].Value)) { _stringValues.Add(value, attrs[0].Value); } else { _stringValues.Add(value, value.ToString()); } } return _stringValues[value]; } }
Questo è un esempio di come decorare gli Enum con le stringhe:
public enum MachineTypes{ [EnumMember(Value = "Motorcycle")] MOTO, [EnumMember()] BICYCLE, CAR }
Poi è semplice, per accedere al stringa basta chiamare il metodo GetStrOfEnumMemberAtt come in questo esempio:
//s1=Motorcycle string s1 = MachineTypes.MOTO.GetStrOfEnumMemberAtt(); //s2=BICYCLE string s2 = MachineTypes.BICYCLE.GetStrOfEnumMemberAtt(); //s3=CAR string s3 = MachineTypes.CAR.GetStrOfEnumMemberAtt();
That is actually a nice way of doing it. I used the Description attribute in order to give the enumeration a nice human readable text to display on the web page. Maybe one could think of a method that retrieves an arbitrary (parameter) attribute of the enumeration.
ReplyDelete