枚举被定义为不给索引值

时间:2020-07-05 09:53:00

标签: c# .net enums enumeration tryparse

亲爱的朋友,

 public enum Units
    {
      Meter = 0,
      Centimeter = 1,
      Milimeter = 2
    }
    
    unitEnumStringOrIndex = "Meter"; //Working
    unitEnumStringOrIndex = "1";// Not working
    
    if(Enum.TryParse<Units>(unitEnumStringOrIndex, true, out Units unitEnum))
    {
      if(Enum.IsDefined(typeof(Units), unitEnumStringOrIndex))
        {
           return true;
        }else {
           return false;
        }
     }else {
      return false;
     }

从上面的示例可以看出,我遇到了一个奇怪的问题。我们有一个枚举类型,我们要确保枚举值存在。为此,我在Microsoft文档中已读到可以使用IsDefined方法来确保存在。 我实现了这一点,并且可以看到当我们传递“ Meter”字符串时,它返回正确的值,但是如果传递“ 1”,则返回的值也不是true。因此,我没有给我返回期望的厘米值。 任何线索将不胜感激。 提前谢谢。

5 个答案:

答案 0 :(得分:1)

基本上,您希望通过值获取枚举名称,因此您可以这样做。

int val = 1;
Units enumValue = (Units)val;
string stringName = enumValue.ToString(); //Centimeter 

答案 1 :(得分:0)

您将索引号作为stirng传递,您应将其作为int传递。

if(Enum.IsDefined(typeof(Units), 1)) //true
if(Enum.IsDefined(typeof(Units), "1")) //false

答案 2 :(得分:0)

实际上,当您使用unitEnumStringOrIndex = "1";时,unitEnum会按预期获得值“厘米”。 问题在于Enum.IDefined:这需要一个对象,该对象要么是名称,要么是字符串,或者是值,是整数。由于您要传递字符串(“ 1”),因此“ IsDefined”将查找枚举中不存在的名称“ 1”。

答案 3 :(得分:0)

工作正常,只是没有达到您的期望。

TryParse方法将成功解析该值,无论它是包含enum成员之一的名称的字符串,还是可以被解析为其中之一的值的字符串enum名成员。

From official documentation:

将一个或多个枚举常量的名称或数值的字符串表示形式转换为等效的枚举对象。返回值指示转换是否成功。

这意味着当您尝试解析字符串"Meter"时,结果为Units.Meter,但是当您尝试解析字符串"1"时,结果为Units.Centimeter

IsDefined方法记录如下:

返回一个布尔值,该布尔值告诉指定的枚举中是否存在给定的整数值或其名称为字符串。

这意味着,如果将其与"1"1一起使用,则会执行不同的操作-字符串与任何enum name 不匹配成员,因此IsDefined返回false,但是int确实与enum成员之一的 value 匹配,因此IsDefined返回{{1 }}。

您可以在rextester.上观看实时演示

答案 4 :(得分:0)

您可以尝试使用此方法检查文本字符串整数字符串的值:

static void Test()
{
  var values = new string[]
  {
    "Meter",
    "1",
    "Meterr",
    "10"
  };
  foreach ( string value in values )
    Console.WriteLine(IsUnitsNameOrValue(value));
}

static public bool IsUnitsNameOrValue(string value)
{
  if ( int.TryParse(value, out int valueInt) )
    return Enum.IsDefined(typeof(Units), valueInt);
  else
    return Enum.TryParse(value, true, out Units unitEnum);
}

结果

True
True
False
False