しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

SelectList のおさらいと Enum から SelectList を作成

まずは SelectList の作り方のおさらいをしておきます。

SelectList はコンストラクタにプリミティブな型のコレクションを指定すると、それが値と項目名の両方に使われます。

var items = new[] { 1, 2, 3, 4, 5 };

var selectList = new SelectList(items);

そして dataValueField と dataTextField でプロパティ名を指定すると、コレクションの要素のプロパティから値と項目名を引っ張ってきてくれます。

var items = new Dictionary<string, int>
{
    { "値1", 1 }, { "値2", 2 }, { "値3", 3 }
};

var selectList = new SelectList(items, "Value", "Key");

SelectList を使うドロップダウンリストなどと、切っても切り離せない関係なのが Enum 型だと思います。

是非ともデータソースとして Enum を使いたいところです。というわけで使ってみました。

var type = typeof(MyEnum);

var items = Enum.GetValues(type)
                .Cast<MyEnum>()
                .ToDictionary(p =>
                {
                    var attribute = (AliasAttribute)type.GetField(p.ToString())
                        .GetCustomAttributes(typeof(AliasAttribute), false).First();

                    return attribute.Name;
                }, p => (int)p);

var selectList = new SelectList(items, "Value", "Key");

Enum を Dictionary に変換してから SelectList を作成しています。割と残念な感じがするコードですが、まあ拡張メソッドにしてキャッシュすればいいでしょう(白目

[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class AliasAttribute : Attribute
{
    public AliasAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; private set; }
}

public enum MyEnum
{
    [Alias("値1")]
    Value1,
    [Alias("値2")]
    Value2,
    [Alias("値3")]
    Value3
}

そして作成した AliasAttribute と MyEnum 型です。特に説明もいらない簡単なコードだと思いますが、AttributeTargets は Field じゃないとダメだったことを初めて知りました。