2017-06-15 87 views
0

我有一类叫做cConstsAndEnums内的枚举:我应该如何转换枚举类型为字符串在C#中

public class cConstsAndEnums 
{ 
    public enum EnSelectedKtovet 
    { 
     En_KtovetMaam = 1, 
     En_KtovetTmg 
    }; 
} 

在其他类我有开关:

switch (dr["rowSelectedKtovet"].ToString()) 
{ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
     doSomthing; 
     break; 
    default: 
} 

的问题是,我m出现错误: 无法将类型'cConstsAndEnums.EnSelectedKtovet'隐式转换为'string'。

我尝试这样做:

case (string)cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 

但我有错误: 无法转换类型 'cConstsAndEnums.EnSelectedKtovet' 到 '串'。

也试过:

case Convert.ToString(cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam): 

但同样我有错误: 恒定值预期。

请帮忙。

谢谢。

+1

'dr [“rowSelectedKtovet”]'是什么类型? – Adrian

+1

[Enum to String]可能重复(https://stackoverflow.com/questions/483794/convert-enum-to-string) – Chawin

+0

@adjan,它是一个datarow类型,但这是好的,没有错误它。 – shlomi

回答

2

原因是开关(字符串的数据类型)是你的情况下(枚举值)不同。试图通过使用.ToString()来解决这个问题意味着您正在进行一项操作,但是一个案例需要始终是一个常数值。以另一种方式做,将字符串投到枚举,然后在交换机上使用它。

cConstsAndEnums.EnSelectedKtovet enumValue = (cConstsAndEnums.EnSelectedKtovet) 
    Enum.Parse(typeof(cConstsAndEnums.EnSelectedKtovet, dr["rowSelectedKtovet"].ToString()); 
switch (enumValue) 
{ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
    ... 
} 

还要考虑存储枚举的数值而不是字符串值。每种枚举字面量,你可以简单地转换为整数的值:

EnSelectedKtovet enumValue = EnSelectedKtovet.En_KtovetMaam; 
int storedEnumValue = (int)enumValue; 
EnSelectedKtovet restoredEnumValue = (EnSelectedKtovet)storedEnumValue; 

有了这个解决方案,您不需要处理任何字符串,这是更为安全和舒适。

+0

也许我不清楚enougth,错误是大小写的,不是在开关 – shlomi

+0

@shlomi错误是你使用'ToString ()'。你不需要它。该领域的类型是什么?数字或字符串?为什么使用'ToString()'当你想再比较一个数字值就像枚举? –

+0

@Fruchtzwerg谢谢,但我得到一个错误: 不能将类型对象隐式转换为cConstsAndEnums.EnSelectedKtovet。存在明确的转换。 – shlomi

0

您应该使用Enum.Parse()方法(如果你确保字符串一直prvoded枚举值),或Enum.TryParse()(在情况下,如果字符串cuold有什么,所以你可以设置您枚举默认值)

你的情况,试试这个:

var myEnum = (EnSelectedKtovet)Enum.Parse(typeof(EnSelectedKtovet), dr["rowSelectedKtovet"].ToString()); 

switch (myEnum) 
{ 
case EnSelectedKtovet.En_KtovetMaam: 
     doSomthing; 
     break; 
     default: 
} 
0

在你的switch语句,将其转换为枚举

switch(Enum.Parse(typeof(EnSelectedKtovet), dr["rowSelectedKtovet"].ToString()){ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
    doSomthing; 
    break; 
    default: 
} 
0
switch ((EnSelectedKtovet)int.Parse(dr["rowSelectedKtovet"].ToString())) 
{ 
    case EnSelectedKtovet.En_KtovetMaam: 

     break; 

    default: 

     break; 
} 

我希望它会为你工作。

0

这是XY Problem的一种情况。你问的是你试图解决的问题,而不是实际的问题。

在这种情况下,实际的问题是您从数据库读取枚举值。索引方法返回一个对象,所以你不能直接与其他任何东西进行比较。你必须转换成它为int(如果数据库返回一个int)或一个字符串。你也可以直接将它强制转换为一个枚举,因为枚举基本上被命名为整数。

取而代之,您试图将其转换为字符串。当您试图将字符串与枚举值进行比较时,您会看到一个编译错误,因为很显然,枚举不是一个字符串。

如果底层字段的值是一个整数,你可以将它转换为枚举的类型:

var value=(cConstsAndEnums.EnSelectedKtovet)dr["rowSelectedKtovet"]; 
switch (value) 
{ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
     doSomthing; 
     break; 
    default: 
} 

如果它是一个包含枚举名一个字符串,你将不得不解析字符串与Enum.ParseEnum.TryParse

var fieldValue=(string)dr["rowSelectedKtovet"]; 
var value=Enum.Parse(typeof(cConstsAndEnums.EnSelectedKtovet),fieldValue); 
switch (value) 
... 

带着几分C#7和模式匹配的魔法,你可以匹配这两种情况下:

var value=dr["rowSelectedKtovet"]; 
switch(value) 
{ 
    case int val when Enum.IsDefined(typeof(cConstsAndEnums.EnSelectedKtovet),val) : 
     var enumValue=(cConstsAndEnums.EnSelectedKtovet)val; 
     //Use enumValue 
     break; 
    case string s when Enum.TryParse<cConstsAndEnums.EnSelectedKtovet>(s,out var enumValue): 
     //Use enumValue 
     break; 
    default : 
     throw new ArgumentException($"Unknown {value}"); 
} 
+0

我做了你的建议,但现在我得到开关(值)的错误: 开关表达式或案例标签必须是布尔型,字符型,字符串型,枚举型或对应的可空类型 – shlomi

+0

它是。所有片段使用实际的枚举。只有模式匹配是不同的,但也可以用C#7编译。你实际上*尝试了什么?数据库返回的* actual *值是什么? –

-1

你可以try.ToString(“D”)来与枚举值进行比较。

string selectedValue= dr["rowSelectedKtovet"].ToString(); 
    if(selectedValue==cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam.ToString("D")) 
     { 
     doSomthing(); 
     } 
+0

更好的是,根本不要转换为字符串。你输入的内容只有在dr [“rowSelectedKtovet”]已经是一个整数或枚举值 –