2011-01-27 85 views
3

我需要將枚舉值列表轉換爲單個字符串存儲在我的數據庫;然後再從數據庫中檢索時再轉換回來。有沒有簡單的方法將c#枚舉轉換爲字符串,然後再返回?

每個枚舉的值當前是一個簡單的整數,所以創建一個額外的表來處理這個問題有點矯枉過正。

因此,在下面的例子中,如果用戶選擇了母親,父親和姐姐,然後存儲在數據庫中的值將是「0,1,3」

public enum MyEnum 
    { 
     Mother = 0, 
     Father = 1, 
     Gran = 2, 
     Sister = 3, 
     Brother = 4 
    } 

我是新來的C# ,所以不知道是否有一個很好的現成的方式來做到這一點 - 谷歌狩獵時我找不到任何明顯的東西!

乾杯提前:) L -

回答

3

下面將通過來回轉換枚舉值的陣列之間「 0,1,3「根據要求:

MyEnum[] selection = { MyEnum.Mother, MyEnum.Father, MyEnum.Sister }; 

string str = string.Join(",", selection.Cast<int>()); 

MyEnum[] enm = str.Split(',').Select(s => int.Parse(s)).Cast<MyEnum>().ToArray(); 
3

只需使用ToString轉換爲名稱,使用Enum.TryParse(或Enum.Parse,如果你不是在.NET 4)轉換回。

如果您希望一個枚舉字段包含多個值(例如MyEnum.Mother | MyEnum.Father),則需要將其轉換爲Flags enum,如@WraithNath suggested。否則,你說的是分別存儲每個選項(沒有辦法將MotherFather與當前設置一起存儲在同一個字段中)。

8

枚舉的是明確地能夠被轉換爲/從整數

int value = (int)MyEnum.Mother; 

MyEnum value = (MyEnum)1; 

對於字符串使用ToStringEnum.Parse

string value = MyEnum.Mother.ToString(); 

MyEnum value = (MyEnum)Enum.Parse(typeof(MyEnum),"Mother"); 
+1

那些是`int`,而不是`string`的請求。 – 2011-01-27 14:04:52

+0

@Fredrik但他也說明如何轉換爲字符串? – 2011-01-27 14:08:31

+0

@Oskar:我認爲,當我發佈評論時,那部分內容並不存在。無論哪種方式,我認爲我實際上誤解了這個問題;這看起來很像所要求的。 – 2011-01-27 14:31:42

2

從你的代碼是

MyEnum a = MyEnum.Mother; 
string thestring = a.ToString(); 
MyEnum b = (MyEnum) Enum.Parse(typeof(MyEnum), thestring); 
4

如果你改變枚舉值:

[Flags] 
public enum MyEnum 
    { 
     Mother = 1, 
     Father = 2, 
     Gran = 4, 
     Sister = 8, 
     Brother = 16, 
    } 

然後你可以存儲父親和Gran爲6

兄妹爲24等

通過使用二進制數字,您不應該通過組合它們來獲得重複值

+1

+1對於久經考驗的方法。 – Joe 2011-01-27 14:05:34

+3

+1。雖然這個枚舉應該標有[Flags] – 2011-01-27 14:05:47

1

字符串Equivelant

MyEnum value = MyEnum.Father; 
value.ToString(); // prints Father 

解析

(MyEnum)Enum.Parse(typeof(MyEnum), "Father"); // returns MyEnum.Father 
0
Enum

s時,可以投給和從整數值。這可能是你最好的選擇。

如果你真的要使用字符串,ToString將返回「母親」,「父親」,「格蘭」等。從字符串鑄造回來也只是一個功能:

private MyEnum GetEnumValue(string fromDB) 
{ 
    if(fromDB == "Mother") return MyEnum.Mother; 
    else if(fromDB == "Father") return MyEnum.Father; 
    //etc. etc. 
} 

編輯: 伊恩的答案鑄造背面是做的更「C#-ey」的方式,而且是更爲擴展(句柄增加新的價值觀枚舉更靈活)。

0

繼Jamiec的建議(這非常適合您的需求),如果你需要防禦性代碼,你的施法,嘗試:

if (Enum.IsDefined(typeof(MyEnum), <your database value>)) 
{ 
    // Safe to convert your enumeration at this point: 
    MyEnum value = (MyEnum)1; 
} 
相關問題