C# 在C中为枚举定义了Tryparse和isd#
我要做的就是: 找出字符串是否是有效的枚举元素,如果是,则返回状态 比如,如果我有一个enum,比如enum_测试,它的值依次是红色、蓝色和绿色 现在,如果蓝色是要验证的元素,我会使用C# 在C中为枚举定义了Tryparse和isd#,c#,.net,enums,C#,.net,Enums,我要做的就是: 找出字符串是否是有效的枚举元素,如果是,则返回状态 比如,如果我有一个enum,比如enum_测试,它的值依次是红色、蓝色和绿色 现在,如果蓝色是要验证的元素,我会使用 Enum_Test evalue; if(Enum.TryParse(string_Verify, true, out evalue)) { return true; } 否则我还有另一个选择 if( Enum.IsDefined(typeof(Enum_Test), string_Veri
Enum_Test evalue;
if(Enum.TryParse(string_Verify, true, out evalue))
{
return true;
}
否则我还有另一个选择
if( Enum.IsDefined(typeof(Enum_Test), string_Verify))
{
return true;
}
上述方法的优点和缺点是什么?在第一种情况下,如果解析成功,那么您将在
evalue
中获得枚举值。您还传递了ignore case参数的true
,因此比较将忽略字符串的大小写。按照现在的方式,它将在success中返回true
,并在evalue
中放弃该值
在第二个代码中,您仅检查是否定义了枚举 第一种方法的优点:它不区分大小写:如果您得到
blue
,并且有一个枚举成员blue
,那么一切都可以
第二种方法的优点:它是自文档化的:您并不真正想要解析,而是想要检查是否有使用给定名称定义的枚举值。因此,在第二种情况下,方法的名称更符合您的意图
也就是说,如果您想要两个优点,请使用第一个方法并将其封装到一个命名良好的方法中(例如,
IsEnumDefinedIgnoreCase
)。另外,请注意,如果您向其传递一个包含数字的字符串,例如“123”,则TryParse方法将返回true.它实际上是用来判断字符串值是否是有效的枚举元素。它们都在内部使用反射Enum.IsDefined
more-so。注意,Enum.TryParse
对于数字字符串(如“123”
)返回true,只要数字在T
的基本类型范围内,即使T
没有对应于123
的值。而Enum.IsDefined
则要严格得多,因为它不仅不处理像“123”
这样的情况,而且在传递的值不是字符串或不是确切的枚举类型时抛出。要获得更健壮的解决方案,您必须将两者结合使用。在MSDN中,enum.tryParse被称为区分大小写。>如果value是枚举值名称的字符串表示形式,则值与枚举名称的比较区分大小写
@BeytanKurt:一般来说,您是对的,但是OP使用and passestrue
表示ignoreCase
。非常感谢您的澄清,我错过了它。