Enum.Parse引发InvalidCastException

时间:2019-07-19 18:09:30

标签: c# enums

我有这行C#代码:

var __allFlags = Enum.Parse(enumType, allFlags);

它抛出了InvalidCastException,我不知道为什么-如果在监视窗口中设置断点并运行Enum.Parse(enumType, allFlags),我得到的是预期的结果,而不是错误。

enumType设置为typeof(PixelColor),其中PixelColor是我用于单元测试的枚举,并且allFlags设置为字符串"Red"PixelColor的可能值之一。

编辑:这是我的单元测试:

[TestMethod]
public void IsFlagSetStringTest()
{
    Assert.IsTrue(EnumHelper.IsFlagSet(typeof(PixelColor), "Red", "Red"));
    Assert.IsFalse(EnumHelper.IsFlagSet(typeof(PixelColor), "Red", "Green"));
    Assert.IsTrue(EnumHelper.IsFlagSet(typeof(PixelColor), "White", "Red"));
    Assert.IsTrue(EnumHelper.IsFlagSet(typeof(PixelColor), "White", "Red, Green"));
    Assert.IsFalse(EnumHelper.IsFlagSet(typeof(PixelColor), "Red", "Red, Green"));
}

这是正在测试的方法:

/// <summary>
/// Determines whether a single flag value is specified on an enumeration.
/// </summary>
/// <param name="enumType">The enumeration <see cref="Type"/>.</param>
/// <param name="allFlags">The string value containing all flags.</param>
/// <param name="singleFlag">The single string value to check.</param>
/// <returns>A <see cref="System.Boolean"/> indicating that a single flag value is specified for an enumeration.</returns>
public static bool IsFlagSet(Type enumType, string allFlags, string singleFlag)
{
    // retrieve the flags enumeration value
    var __allFlags = Enum.Parse(enumType, allFlags);
    // retrieve the single flag value
    var __singleFlag = Enum.Parse(enumType, singleFlag);

    // perform bit-wise comparison to see if the single flag is specified
    return (((int)__allFlags & (int)__singleFlag) == (int)__singleFlag);
}

以防万一,这里是用于测试的枚举:

/// <summary>
/// A simple flags enum to use for testing.
/// </summary>
[Flags]
private enum PixelColor
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4,
    White = Red | Green | Blue
}

1 个答案:

答案 0 :(得分:2)

我怀疑问题在于您的按位比较:

return (((int)__allFlags & (int)__singleFlag) == (int)__singleFlag);

由于Enum.Parse在任何情况下都不会抛出InvalidCastException,而是返回object类型。

作为调试步骤,注释掉该行并将其替换为return true;,然后运行测试以查看是否引发了异常。如果不是,您可能需要在强制转换为Parse之前在前int行中显式转换为枚举类型。