2011-01-27 63 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; 
} 
相关问题