C# 在C中为枚举定义了Tryparse和isd#

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,比如enum_测试,它的值依次是红色、蓝色和绿色

现在,如果蓝色是要验证的元素,我会使用

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 passes
true
表示
ignoreCase
。非常感谢您的澄清,我错过了它。