げんさん日記

プログラミングで気付いた事等を書きます。

Enumの内容をコンボボックス用のデータとして取得する。

2019年11月06日 09時49分12秒 | C#
enumに設定してある内容をコンボボックスのデータとして取得する方法を下記に記します。

enumの定義を下記のようにします。Descriptionに表示する内容を定義します。
public enum EncodeType
{
  [Description("shift_jis")]
  ShiftJis = 0,
  [Description("utf-8")]
  UTF8 = 1,
}

Enum値を取得する拡張クラスを作成します。
public static int Value(this Enum value)
{
  // Fieldを取得します。
  var fi = value.GetType().GetField(value.ToString());

  // Fieldから値を取得し返します。
  return (int)fi.GetValue(null);
}

Enum値に対応する名称を取得する拡張クラスを作成します。
public static string Name(this Enum value)
{
  // 指定されたEumのFieldを取得します。
  var fi = value.GetType().GetField(value.ToString());
  if (fi == null)
  {
    // 取得できなかった時、NULLを返します。
    return null;
  }

  // DescriptionAttributeを取得します。
  var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
  if (attributes != null && attributes.Length > 0)
  {
    // DescriptionAttributeが存在する時、DescriptionAttributeの内容を返します。
    return attributes[0].Description;
  }
  else
  {
    // DescriptionAttributeが存在しない時、値に対応する名称を返します。
    return value.ToString();
  }
}

コンボボックス用データを取得する拡張クラスを作成します。
public static ICollection GetComboData<T>(this T value)
{
  // Enumの値リストを取得します。
  var fields = value.GetType().GetFields();
  var enmName = value.GetType().Name;

  // 値リストからコンボデータを作成します。
  var datas = fields.ToList().Where(w => w.FieldType.Name == enmName).Select(s => new Models.ComboBoxModel()
   {
     Value = ((int)s.GetValue(null)).ToString(),
     Name = Name((Enum)s.GetValue(null)),
   }).ToList();

  // 作成したコンボデータを返します。
  return datas;
}
※Models.ComboBoxModelはValue とName を持つモデルです。

使用例
public void OnClick()
{
  var comboData = (default(EncodeType)).GetComboData();
}
上記でEnumの値を全て取得できますし、enumの内容が変更されても対応がenumの変更のみで終わる為、保守性が上がります。