亲爱的朋友,
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。因此,我没有给我返回期望的厘米值。 任何线索将不胜感激。 提前谢谢。
答案 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
名成员。
将一个或多个枚举常量的名称或数值的字符串表示形式转换为等效的枚举对象。返回值指示转换是否成功。
这意味着当您尝试解析字符串"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