5

基本上我想用十进制值定义一个枚举,但这是不可能的。另一种选择是:

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);

这可以包装在一个类中,因此您只按索引公开一个 getter,而不是整个Dictionary<TKey,TValue>接口。

于 2013-03-20T21:28:08.497 回答
3

没有办法简单。enum只接受整数值。你放的代码片段很好。

const decimal和之间有细微差别static readonly decimal。一是直接评价;编译器将名称替换为其值。相反,readonly强制代码每次都引用该字段并从中获取值。您可以观察为什么readonly与引用类型一起使用而const不能(期望字符串)。

于 2013-03-20T21:28:14.280 回答
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 回答
2

static readonly十进制数组怎么样?

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