Tuesday, September 21, 2010

Just Another String Enum

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 come cache per essere più performante.

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();

1 comment:

  1. 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