C#のEnum型の取り扱い

Enumの要素をforeachで回す

Enum.GetValues()を使う。引数にtypeof()でEnumのタイプを指定する。
foreachで取り出した変数をintやstringにキャストすると値や名前を取れる。

public class Sample{  
    public enum Sexs{  
        [Display(Name = "男")]  
        Male = 1,  
        [Display(Name = "女")]  
        Female = 2,  
        [Display(Name = "不詳")]  
        Unknown = 3  
    }   

    public void Sample(){  
        foreach( var sex in Enum.GetValues(typeof(Sexs)){  
            // 値  
            int val = (int)sex;  
            // 名前  
            string name = sex.ToString();  

            Console.WriteLine(val); // 1, 2, 3  
            Console.WriteLine(name); // Male, Female, Unknown  
        }  
    }

Enumに指定した属性を表示したい

@HTML.LabelFor(m => m.sex)のような形でビューの中で[Display(Name = "")]を表示することは可能だが、例えばListや、このようなリストクラスをプロパティに持つオブジェクトを繰り返しで回して表示しようとすると対応できない。
Enumの拡張クラスを作って対応する。

public static class EnumExtentions{  
    public static T GetAttribute<T> (this Enum value) where T : Attribute  
        {  
            var type = value.GetType();  
            var memberInfo = type.GetMember(value.ToString());  
            var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);  
            return attributes.Length > 0 ? (T)attributes[0] : null;  
        }  

        public static string ToName(this Enum value)  
        {  
            var attribute = value.GetAttribute<DisplayAttribute>();  
            return attribute == null ? value.ToString() : attribute.Name;  
        }  
}

これでsex.ToName()のような形で[Display(Name = "")]を取得してプロパティに設定できる。
このクラスに[Display(Name = "")]以外の属性を取得する拡張も追加するなどの応用もきく。