Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中如何将枚举类型转换为字符串#_C#_String_Enums_Type Conversion - Fatal编程技术网

C# 在C中如何将枚举类型转换为字符串#

C# 在C中如何将枚举类型转换为字符串#,c#,string,enums,type-conversion,C#,String,Enums,Type Conversion,我在一个名为cConstsAndEnums的类中有一个枚举: public class cConstsAndEnums { public enum EnSelectedKtovet { En_KtovetMaam = 1, En_KtovetTmg }; } 在其他类别中,我有开关: switch (dr["rowSelectedKtovet"].ToString()) { case cConstsAndEnums.EnSelectedKtov

我在一个名为cConstsAndEnums的类中有一个枚举:

public class cConstsAndEnums
{
   public enum EnSelectedKtovet
   {
      En_KtovetMaam = 1,
      En_KtovetTmg
   };
}
在其他类别中,我有开关:

switch (dr["rowSelectedKtovet"].ToString())
{
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam:
       doSomthing;
       break;
    default:
}
问题是我遇到了一个错误: 无法将类型“cConstsAndEnums.EnSelectedKtovet”隐式转换为“string”

我试着做:

case (string)cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam:
但我有一个错误: 无法将类型“cConstsAndEnums.EnSelectedKtovet”转换为“string”

还审判了:

   case Convert.ToString(cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam):
但我又犯了一个错误: 应为常量值

请帮忙


谢谢。

您应该使用Enum.Parse()方法(如果您确保字符串始终提供枚举值)或Enum.TryParse()(如果字符串可能有任何内容,那么您可以将枚举设置为默认值)

在您的情况下,请尝试以下方法:

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

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

原因是开关的数据类型(字符串)与您的案例(枚举值)不同。尝试使用
.ToString()
解决此问题意味着您正在执行一个操作,但案例始终需要一个常量值。以另一种方式执行此操作,在开关处使用字符串之前,将字符串强制转换为enum

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;

使用此解决方案,您不需要处理任何字符串,这将更加安全和舒适。

在switch语句中,将其转换为enum

switch(Enum.Parse(typeof(EnSelectedKtovet), dr["rowSelectedKtovet"].ToString()){
  case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam:
     doSomthing;
     break;
  default:
}
我希望它能对你有用。

这是一个例子。您所问的是您尝试的解决方案,而不是实际问题

在本例中,实际问题是从数据库中读取枚举值。index方法返回一个对象,因此不能直接将其与其他对象进行比较。您必须将其转换为int(如果数据库返回int)或字符串。您也可以直接将其强制转换为枚举,因为枚举基本上是命名的整数

相反,您尝试将其转换为字符串。当您尝试将该字符串与枚举值进行比较时,出现了编译错误,因为枚举显然不是字符串

如果基础字段值是整数,则可以将其强制转换为枚举的类型:

var value=(cConstsAndEnums.EnSelectedKtovet)dr["rowSelectedKtovet"];
switch (value)
{
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam:
       doSomthing;
       break;
    default:
}
如果是包含枚举名称的字符串,则必须使用或来解析该字符串

使用一点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}");
}
var value=dr[“rowSelectedKtovet”];
开关(值)
{
定义枚举时的大小写int val(typeof(cConstsAndEnums.EnSelectedKtovet),val):
var enumValue=(cConstsAndEnums.EnSelectedKtovet)val;
//使用枚举值
打破
Enum.TryParse(s,out var enumValue)时的大小写字符串s:
//使用枚举值
打破
违约:
抛出新ArgumentException($“未知{value}”);
}
您可以尝试使用.ToString(“D”)与枚举值进行比较

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

dr[“rowSelectedKtovet”]
属于哪种类型?可能与@adjan重复,它是一种数据行类型,但这没有问题,没有错误。@Chawin,我看到了,但它对我没有帮助。@shlomi为什么没有帮助?事实上,这是正确的答案——事实上,这个问题应该作为一个副本来结束。。如果要获取枚举值的字符串表示形式,请使用
enum.GetName
可能我不清楚Enough,错误在大小写上,而不是在switch@shlomi错误在于您根本没有使用
ToString()
。你不需要它。字段的类型是什么?数字还是字符串?为什么要使用
ToString()
将其与枚举之类的数值进行比较?@Fruchtzwerg谢谢,但我遇到一个错误:无法将类型对象隐式转换为cConstsAndEnums.EnSelectedKtovet。存在显式转换。正确-我忘记强制转换Enum.Parse的结果。。。我已经更新了答案。现在就应该做这个把戏了。谢谢大家!!!重演的演员不见了。工作完美。我按照您的建议做了,但现在我在开关(值)上遇到了错误:开关表达式或大小写标签必须是bool、char、string、enum或相应的可空类型,并且它是。所有代码段都使用实际的枚举。只有模式匹配是不同的,而且是用C#7编译的。你到底试了什么?数据库返回的实际值是多少?最好不要转换为字符串。只有在
dr[“rowSelectedKtovet”]
已经是整数或枚举值时,您键入的内容才有效
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}");
}
  string selectedValue= dr["rowSelectedKtovet"].ToString();
    if(selectedValue==cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam.ToString("D"))
      {
        doSomthing();
      }