Yuta.NET

C#の拡張メソッドを用いたenumの小技


定数で且つグループ化できるものはenumを使った方が良い (というか使ってくれ...orz)

また、enumは色々と工夫次第で便利になります。
ここでは拡張メソッドを使った小技を紹介しますので上手く応用して可読性を上げよう!!

下のコードは拡張メソッドを使って列挙子と対となる文字列を定義して取得しています。
昔は配列とenumを組み合わせたりしてゴニョゴニョしていたり、配列の要素を直に指定したり
...カオスでしたw まぁ、未だに見かけますが...


using System;
using System.Linq;

namespace YutaCore.ConsoleApp1
{
    /// <summary>
    /// Enum拡張メソッド用クラス
    /// </summary>
    public static class EnumExtensions
    {
        /// <summary>
        /// 名称を返す
        /// </summary>
        /// <param name="week"><c>DayOfWeek</c></param>
        /// <returns>名称</returns>
        public static string ToName(this DayOfWeek week)
        {
            string rtn = string.Empty;

            switch(week)
            {
                case DayOfWeek.Sunday:
                    rtn = "日";
                    break;
                case DayOfWeek.Monday:
                    rtn = "月";
                    break;
                case DayOfWeek.Tuesday:
                    rtn = "火";
                    break;
                case DayOfWeek.Wednesday:
                    rtn = "水";
                    break;
                case DayOfWeek.Thursday:
                    rtn = "木";
                    break;
                case DayOfWeek.Friday:
                    rtn = "金";
                    break;
                case DayOfWeek.Saturday:
                    rtn = "土";
                    break;
            }
            
            return rtn;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string name = string.Empty;
            // 整形用に最大文字数を取得(注:この記述のLinqは.NET3.5以上で使用可)
            int maxLength = Enum.GetNames(typeof(DayOfWeek)).Max(v => v.Length);

            // foreachでEnumの全ての列挙子(値)を取得
            foreach (DayOfWeek value in Enum.GetValues(typeof(DayOfWeek)))
            {
                // 固定幅で名称を取得
                name = string.Format("{0, -" + maxLength + "}", value.ToString());
                Console.WriteLine("{0}:{1} : {2}曜日", (int)value, name, value.ToName());
            }
            Console.ReadKey(true);
        }
    }
}