1. ホーム
  2. c#

SelectListにenumの値を取得する方法

2023-09-06 06:10:19

質問内容

このような列挙があるとします(あくまで例です)。

public enum Direction{
    Horizontal = 0,
    Vertical = 1,
    Diagonal = 2
}

列挙の内容が将来変更される可能性があることを考慮して、これらの値を System.Web.Mvc.SelectList に取得するルーチンをどのように書けばよいでしょうか。私はこのように、オプションテキストとして各列挙体の名前を取得し、値テキストとしてその値を取得したいです。

<select>
    <option value="0">Horizontal</option>
    <option value="1">Vertical</option>
    <option value="2">Diagonal</option>
</select>

今のところこれが精一杯です。

 public static SelectList GetDirectionSelectList()
 {
    Array values = Enum.GetValues(typeof(Direction));
    List<ListItem> items = new List<ListItem>(values.Length);

    foreach (var i in values)
    {
        items.Add(new ListItem
        {
            Text = Enum.GetName(typeof(Direction), i),
            Value = i.ToString()
        });
    }

    return new SelectList(items);
 }

しかし、これは常にオプションのテキストを 'System.Web.Mvc.ListItem' としてレンダリングします。これをデバッグすると、Enum.GetValues() が期待した 0, 1 の代わりに 'Horizontal, Vertical' などを返していることもわかります。これは Enum.GetName() と Enum.GetValue() の違いは何だろうかと考えさせられます。

どのように解決するのですか?

enumの値を取得するためには、enumをその基礎となる型にキャストする必要があります。

Value = ((int)i).ToString();