C# 構造体のカスタム属性をつかったHTMLのセレクトボックス(ドロップダウン)の作成方法

概要

C#の構造体の情報を使ってHTMLのセレクトボックス(ドロップダウンともいうselectタグとoptionタグのやつ)を作成する場合、値であるvalueは構造体から取得できますが、実際に画面に表示させる文字列はどうやっていますか?
今回はそれらの情報をカスタム属性を使用して構造体に記載し、構造体のデータだけでセレクトボックスを作成する方法を解説します。

前提環境
  • Windows 10
  • Visual Studio Professional 2019
  • .NET Framework 4.2
  • C#

コードのポイント

  • カスタム属性「System.ComponentModel.DescriptionAttribute」を使うことで、構造体のメンバに対して説明の文字列を追加することができます。
  • 構造体のメンバをforeachで取得するにはEnum.GetValuesを使用します。
  • カスタム属性を取得するにはGetCustomAttributesを使用します。

サンプルコード

前提となる構造体

public enum FruitEnum
{
     [System.ComponentModel.DescriptionAttribute("りんご")]
     Apple = 1,

     [System.ComponentModel.DescriptionAttribute("みかん")]
     Orange = 2,

     [System.ComponentModel.DescriptionAttribute("パイナップル")]
     Pine = 3,
}

HTMLのセレクトボックス(ドロップダウン)の作成

Type type = typeof(FruitEnum);
string inputHtml = "<select name=\"fruitName\">";

// 構造体の各メンバの値をforeachで取得する。
foreach (Object enumVal in Enum.GetValues(type))
{
    // 構造体の値からメンバを取得
    FieldInfo enumField = type.GetField(enumVal.Tostring());

    // 構造体のメンバに設定したカスタム属性を取得する。
    // カスタム属性は同じものを複数設定できることがあるため、配列で取得することになる。
    // そのためFirstOrDefaultで1つに絞り込む。
    var attributes = (DescriptionAttribute[])enumField.GetCustomAttributes(typeof(DescriptionAttribute), false);
    var desciptionstring = attributes.Select(n => n.Description).FirstOrDefault();
    string enumName = desciptionstring.Tostring();

    inputHtml += $"<option value=\"{enumVal.Tostring()}\">{enumName}</option>";
}
inputHtml += $"</select>";

Formから取得したデータ(文字列)を構造体に変換する場合

string value = Page.Request.Form["fruitName"];

FruitEnum fruit;
if (! Enum.TryParse<FruitEnum>(value, out fruit)) {
    fruit = FruitEnum.Apple;
}

コメントする

CAPTCHA