6

データベースの spicelevel 列の値を 1、2、および 3 に制限したい場合は、次のようにすることができます。

    private enum SpiceLevel
    {
        Low=1,
        Medium=2,
        Hot=3
    }

(int)SpiceLevel.Low次に、コードで、スパイス レベルとして 1 を選択することができます。

データベース内の列の値として "Red Rose"、"White Rose"、"Black Rose" のみを受け入れる必要がある場合はどうすればよいでしょうか? これを処理するための優雅な方法は何ですか?

それらを構成ファイルまたは定数に保存することを考えていますが、どちらも列挙型ほど優雅ではありません。何か案は?

アップデート:

ここでの答えは私のために働いた

4

4 に答える 4

7

propertyこれには a を使用できます

public string[] AllowedRoses = new string[] {  "Red Rose", "White Rose" ,"Black Rose" };
string _Rose = "Red Rose";
public string Rose
{
    get
    {
        return _Rose;
    }
    set
    {
        if (!AllowedRoses.Any(x => x == value)) 
               throw new ArgumentException("Not valid rose");
        _Rose = value;
    }
}
于 2013-08-15T23:18:49.900 に答える
1

次のオプションが表示されます。

  • セッターの値を確認します(たとえば、l4Vの回答を参照)

  • 概念的には、列挙型について考えています。したがって、次のことができます。

enum RoseType { RedRose, WhiteRose, BlackRose };

次に、この列挙型から文字列への適切な変換を提供します。これを行うための 2 つの便利なオプションがここで説明されています: Enum ToString with user Friendly strings。1 つはカスタムの Description 属性を使用することで、2 番目 (私はこちらの方がいいと思います) は拡張メソッドを提供します。

public static class RoseTypeExtensions
{
  public static string GetString(this RoseType @this)
  {
    switch (@this)
    {
      case RoseType.RedRose:
        return "Red Rose";
      case RoseType.WhiteRose:
        return "White Rose";
      case RoseType.BlackRose:
        return "Black Rose";
      default:
        throw new InvalidOperationException();
    }
  }
}
  • 定数のセットを作成します。
public class RoseType
{
  public readonly RoseType RedRose = new RoseType("Red Rose");
  public readonly RoseType WhiteRose = new RoseType("White Rose");
  public readonly RoseType BlackRose = new RoseType("Black Rose");

  public string Content { get; private set; }

  private RoseType(string content)
  {
    this.Content = content;
  }

  public override string ToString()
  {
    return this.Content;
  }
}

Oskar Berggren がコメントで正しく指摘したようにRoseTypeToString: EqualsGetHashCodeoperator==およびoperator!=.

于 2013-08-15T23:23:52.780 に答える
0

本当に良い解決策はありません。それらはすべて、データベースを C# の列挙型と "同期" する必要があります。

最も簡単な解決策:

あなたが言ったことは、データベースに列挙値を整数として保存します。

ほぼ同じですが、効率は劣ります。

値を文字列としてデータベースに保存し、anEnumVar.ToString()and Enum.Parse(または Enum の他の解析メソッド) を使用して文字列と列挙型の間で変換します。

複雑だが柔軟:

データベースに一種の列挙型を用意します。文字列値と ID を持つテーブルを作成し、列挙型を保存するテーブルへの外部キーを使用します。これにより、数値または文字列値を使用して (結合を介して) 選択/更新/挿入することができます。

また、対応する列挙値を持たない整数を格納することはできないため、整合性も維持されます。

欠点は複雑さです。

于 2013-08-15T23:22:24.430 に答える