Enum.Parse(),肯定有更简洁的方法吧?

10 浏览
0 Comments

Enum.Parse(),肯定有更简洁的方法吧?

假设我有一个枚举,

public enum Colours
{
    Red,
    Blue
}

我唯一能想到的解析方法是这样做:

string colour = "Green";
var col = (Colours)Enum.Parse(typeof(Colours),colour);

这会抛出一个System.ArgumentException异常,因为"Green"不是Colours枚举的成员。

现在我真的不喜欢用try/catch来包装代码,有没有更简洁的方法来做这件事,而不需要我遍历每个Colours枚举,并对colour进行字符串比较?

0
0 Comments

Enum.Parse()是一个在C#中用于将字符串转换为枚举类型的方法。然而,有时候我们希望能够在转换失败时给出一个默认值,而Enum.Parse()并没有提供这样的功能。这就导致了Enum.Parse()的使用不够方便。

为了解决这个问题,我们可以使用.Net 4中引入的Enum.TryParse()方法。Enum.TryParse()是一个重载的方法,它接受一个字符串值和一个输出参数,并尝试将字符串值转换为指定的枚举类型。如果转换成功,将输出参数设置为转换后的枚举值,并返回true;否则,将输出参数设置为枚举类型的默认值,并返回false。

下面是Enum.TryParse()方法的签名:

Enum.TryParse<TEnum>(
    string value,
    [bool ignoreCase,]
    out TEnum result
)

在使用Enum.TryParse()时,我们可以指定是否忽略大小写。另外,我们可以通过省略类型参数来让编译器自动推断枚举类型。

下面是一个使用Enum.TryParse()方法的示例:

    enum Colour
    {
        Red,
        Blue
    }
    private void ParseColours()
    {
        Colour aColour;
        if (Colour.TryParse("RED", true, out aColour))
        {
           // ... 转换成功
        }
        if (Enum.TryParse("Red", out aColour))
        {
           // ... 转换成功
        }
        if (Enum.TryParse<Colour>("Red", out aColour))
        {
          // ... 转换成功
        }
    }

通过使用Enum.TryParse()方法,我们可以更方便地将字符串转换为枚举类型,并且在转换失败时可以设置一个默认值。这使得代码更加简洁、易读和可维护。

0
0 Comments

Enum.Parse()是一个用于将字符串转换为枚举类型的方法。然而,当传入的字符串无法转换为有效的枚举成员时,Enum.Parse()方法会抛出一个异常。这就需要开发者在使用Enum.Parse()方法时,使用try/catch语句来捕获可能的异常。

为了避免使用try/catch语句,可以先使用Enum.IsDefined()方法来判断传入的字符串是否是一个有效的枚举成员。Enum.IsDefined()方法会返回一个布尔值,指示传入的值是否是该枚举类型的成员。

另外,需要注意的是,即使传入的字符串中包含数字,但它们并不一定是枚举类型的成员。因此,在使用Enum.Parse()方法之前,还应该使用int.TryParse()方法来尝试将字符串解析为整数,并使用Enum.IsDefined()方法来检查解析的整数是否是有效的枚举成员。

通过先使用Enum.IsDefined()方法进行判断,可以避免不必要的异常抛出,提高代码的性能和可读性。

以下是使用Enum.Parse()方法的问题出现的原因以及解决方法的总结:

问题:

当传入的字符串无法转换为有效的枚举成员时,Enum.Parse()方法会抛出异常。

解决方法:

1. 使用Enum.IsDefined()方法先判断传入的字符串是否是一个有效的枚举成员。

2. 如果Enum.IsDefined()方法返回true,则使用Enum.Parse()方法将字符串转换为枚举类型。

3. 如果Enum.IsDefined()方法返回false,则字符串不是有效的枚举成员,可以进行相应的错误处理。

代码示例:

string input = "SomeValue";
if (Enum.IsDefined(typeof(MyEnum), input))
{
    MyEnum value = (MyEnum)Enum.Parse(typeof(MyEnum), input);
    // 对value进行后续操作
}
else
{
    // 字符串不是有效的枚举成员,进行错误处理
}

0
0 Comments

在上述内容中,提到了一个问题:使用Enum.Parse()方法时可能会出现问题。出现这个问题的原因是Enum.Parse()方法在解析枚举时,要求传入的值必须是字符串类型,而不能是枚举类型本身。解决这个问题的方法是使用Enum.TryParse()方法或自定义的扩展方法。

在4.0版本中,可以使用Enum.TryParse()方法来解决这个问题。该方法能够将字符串解析为指定的枚举类型,并返回解析结果的布尔值表示是否解析成功。

另外,还可以通过自定义的扩展方法来解决这个问题。上述提到的扩展方法如下所示:

public static bool TryParse<T>(this Enum theEnum, string valueToParse, out T returnValue)
{
    returnValue = default(T);
    int intEnumValue;
    if (Int32.TryParse(valueToParse, out intEnumValue))
    {
        if (Enum.IsDefined(typeof(T), intEnumValue))
        {
            returnValue = (T)(object)intEnumValue;
            return true;
        }
    }
    return false;
}

这个扩展方法的作用是将字符串解析为指定的枚举类型。它首先将字符串转换为整数类型,然后判断该整数值是否在指定的枚举类型中定义,如果是,则将整数值转换为指定的枚举类型,并将解析结果赋值给返回参数returnValue,最后返回解析结果的布尔值表示是否解析成功。

需要注意的是,这个自定义的扩展方法需要在泛型参数约束中添加一个限制条件,即T必须是一个结构体类型,如下所示:

public static bool TryParse<T>(this Enum theEnum, string valueToParse, out T returnValue) where T : struct

以上就是解决Enum.Parse()方法问题的原因和解决方法的整理。通过使用Enum.TryParse()方法或自定义的扩展方法,我们可以更方便地解析枚举类型的字符串值。

0