2

これは私にとって難しい概念なので、我慢してください。アイテムを文字列として返すメソッドがありenumます(DBストレージ用)。メソッドは次のとおりです。

public static IEnumerable<SelectListItem> GetItemsFromEnum<T>
    (T selectedValue = default(T)) where T : struct
{
    return from name in Enum.GetNames(typeof(T))
       let enumValue = Convert.ToString((T)Enum.
           Parse(typeof(T), name, true))

           select new SelectListItem
           {
               Text = GetEnumDescription(name, typeof(T)),
               Value = enumValue,
               Selected = enumValue.Equals(selectedValue)
           };
}

(注:テキストを取得して UI にわかりやすいものを表示GetEnumDescriptionするクラスの別のメソッドです。)[Display(Name="")

単一の選択入力 (ラジオ ボタン、ドロップダウン) の場合、これはうまく機能します。ただし、複数選択(リストボックス、チェックボックスリスト)では、enum [Flags]属性を使用してDBに保存することを考えていますint.

ただし、GetItemsFromEnumメソッドで割り当てられた値が の文字列値ではなく、値[Flags]になるように変更する必要がある場合、メソッドは機能しません。GetItemsFromEnumenumint

これは実際には 2 部構成です。

  1. fromenumValueの値になるようにメソッドを変更するにはどうすればよいですか (つまり、「1 + 2」が選択されている場合 (2 つのチェック ボックス)、保存される値は「3」になります)。intenum [Flags]int
  2. 最も重要なことは、メソッドにどのような種類のロジックを挿入すれば、他enumのすべての ( のないもの[Flags]) が影響を受けない (つまり、引き続き を変換するToString) ことができるかということです。私はいくつかのif ... else論理を考えていましたが、それはうまくいきますか?
4

1 に答える 1

2

まず第一に、[Flags]属性は列挙型の値に特別なプロパティを追加しませんEnum。文字列としてフォーマットするときにクラスによるリフレクションを介して使用され、コードを使用する人々に列挙型でビット演算を安全に使用できることを知らせます。 、言い換えれば、望ましくない結果なしで。

この列挙型を見てみましょう:

[Flags]
enum MyEnum
{
    Undefined,
    Employee,
    Student
}

そして、この方法で変数を作成しましょう:

var employeeAndStudent = MyEnum.Employee | MyEnum.Student;

整数にキャストされた場合、変数は 3 に等しくなります。ToString()メソッドは「Employee, Student」をEnum.GetNames出力しますが、フィールド 3 に値が割り当てられていませ。私は2つの解決策を考えることができます:

  1. 独自の名前を作成するGetNamesと、定義された名前に加えて、列挙型の値のすべての可能な組み合わせが返され、便利な形式で出力されます。

  2. 列挙型でフラグを定義しますが、メンバーが多い場合はかなり無駄になる可能性があります。この場合、次のMyEnumようになります。

    [Flags]
    enum MyEnum
    {
        Undefined,
        Employee,
        Student,
        EmployeeAndStudent
    }
    

もう1つ、あなたの方法にはバグがあるようです。この行:

Selected = enumValue.Equals(selectedValue)

列挙型を文字列と比較しようとしており、常に false になります。あなたはそれSelectListItem.Valueがタイプであるべきだと確信していますstringか?コードを見直すことをお勧めします。

質問に直接回答するには:

  1. [Flags]列挙型に追加し、OR 演算子を使用して値を結合します。
  2. GetEnumDescriptionメソッドで、型にFlags属性があるかどうかを確認します。
于 2013-01-03T13:56:29.573 に答える