枚举被定义为不从索引中给出值

Enum Is Defined not giving value from Index

亲爱的朋友们,

 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;
     }

正如您从上面的示例中看到的那样,我遇到了一个奇怪的问题。我们有一个枚举类型,我们想确保枚举值 exists.so 我在 Microsoft 文档中读到我们可以使用 IsDefined 方法来确保存在。 我实现了它,当我们传递“Meter”字符串时,我可以看到它 return 是正确的值,但如果我传递“1”,它的方式类似,那么它不会 return 为真。所以我没有 return 我期望的 Centimeter 值。 任何线索都会受到赞赏。 提前致谢。

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

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

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

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

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

它运行良好,只是不如您预期的那样。

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

From official documentation:

Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. The return value indicates whether the conversion succeeded.

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

IsDefined方法文档如下:

Returns a Boolean telling whether a given integral value, or its name as a string, exists in a specified enumeration.

这意味着如果你给它输入 "1"1 它会做不同的事情 - 字符串不匹配任何的 name enum 成员,因此 IsDefined returns false,但是 int 确实匹配 enum 之一的 value成员,因此 IsDefined returns true.

您可以在 rextester.

上观看现场演示

您可以试试这个来检查 文本字符串 整数字符串 值:

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