2013-03-20 64 views
4

基本上我想定義一個枚舉十進制值,但這是不可能的。另一種方法是:枚舉十進制值或一些這樣的

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

什麼是模擬與我的要求枚舉的最佳方式?

回答

2

static readonly數組小數怎麼樣?

public static readonly decimal[] myValues = new[] {0, 0.5M, 1}; 
+1

但我無法顯示值的名稱。 – 2013-03-20 21:43:10

5

字典可能是一個不錯的選擇。

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>接口一個getter。

+0

你也可以讓你的字典靜態只讀,並用初始化列表靜態初始化它。這將表現得更像一個枚舉IMO。 – joce 2013-03-20 21:36:22

+0

@Joce - 你仍然可以在這樣的字典上調用Add。你只是不能替換字典。 – Oded 2013-03-20 21:38:03

+0

嗡嗡聲。真正。 : - /有沒有辦法將一個字典(或任何類型的複雜對象)聲明爲編譯時間常量? – joce 2013-03-20 21:42:34

1

沒有簡單的方法。 enum只接受整數值。你放的代碼片段很好。

const decimalstatic readonly decimal之間有一個小小的差異。首先是直接評估;編譯器用它的值替換名稱。相反,readonly強制執行代碼以每次引用該字段並從中提取值。您可以觀察爲什麼readonly正在與引用類型一起使用,而const不能(需要字符串)。

+0

是的。 OP在問題中提到這是不可能的,但希望替代品。 – Oded 2013-03-20 21:28:44

+0

我不明白。爲什麼枚舉支持十六進制,但它不支持小數點,浮點數,雙精度? – 2013-03-21 11:34:05

+1

@ Overflow012因爲'十六進制'實際上是一個整數。一個'enum'只支持整數常量,它以一種常用的方式(1,2,4,16,32,...)使用,即2的冪。這使得程序員可以結合許多選項(例如'FileMode.Open | FileMode.Append')。但是,'decimal','float'和'double'類型在C#中不是整數,因此它們不受支持 – 2013-03-28 03:51:24

1

你可能會略有不同類:

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是公共財產。