5

基本的に、10 進数値で列挙型を定義したいのですが、これは不可能です。別の方法は次のとおりです。

public static class EstadoRestriccion
{
    public const decimal Valur1 = 0;
    public const decimal Value2 = 0.5M;
    public const decimal Value3 = 1;
};

しかし、これらの定数をコンボボックスに追加する必要があります。表示するオプションは定数の名前でSelectedItem、値 (0、0.5M、1) などを返す必要があります。私はそれが可能であることを知っていますが、それは醜いです。

列挙型を使用すると、これを簡単に実行できます。comboBox.DataSource = Enum.GetValues(typeof(MyEnum));

私の要件で列挙型をシミュレートする最良の方法は何ですか?

4

4 に答える 4

6

辞書は良い選択かもしれません。

Dictionary<string,decimal>値に名前を付けることができます。

var values = new Dictionary<string,decimal>();
values.Add("Value1", 0m);
values.Add("Value2", 0.5m);
values.Add("Value3", 1m);

これはクラスにラップできるため、Dictionary<TKey,TValue>インターフェイス全体ではなく、インデックスごとにゲッターのみを公開できます。

于 2013-03-20T21:28:08.497 に答える
3

クラスを少し変更できます。

public class EstadoRestriccion
{
    public static readonly EstadoRestriccion Value1 = new EstadoRestriccion("Value1", 0);
    public static readonly EstadoRestriccion Value2 = new EstadoRestriccion("Value2", 0.5M);
    public static readonly EstadoRestriccion Value3 = new EstadoRestriccion("Value3", 1);
    private static readonly EstadoRestriccion[] values = new EstadoRestriccion[] { Value1, Value2, Value3 };

    private string name;
    private decimal value;

    private EstadoRestriccion(string name, decimal value)
    {
        this.name = name;
        this.value = value;
    }

    public static EstadoRestriccion[] GetValues()
    {
        return values;
    }

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

そして、公共の財産になるための何らかのdecimal変換および/または変更。value

于 2013-03-20T21:40:26.627 に答える
3

単純に方法はありません。enum整数値のみを受け入れます。あなたが入れたコードスニペットは良いです。

と の間にはわずかな違いがconst decimalありstatic readonly decimalます。1 つ目は直接評価です。コンパイラは名前をその値に置き換えます。対照的に、readonly毎回フィールドを参照し、そこから値を取得するようにコードを強制します。readonlyが参照型で使用されている理由を観察できますが、使用するconstことはできません (文字列を期待してください)。

于 2013-03-20T21:28:14.280 に答える
2

static readonly10進数の配列はどうですか?

public static readonly decimal[] myValues = new[] {0, 0.5M, 1};
于 2013-03-20T21:27:24.390 に答える