枚举被定义为不从索引中给出值
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
个成员。
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
亲爱的朋友们,
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
个成员。
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