枚举类型解析抛出 InvalidCastException 异常

5

我有一行 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
}

你是否在使用多线程代码?在“allFlags”的值上似乎存在潜在的竞态条件。 - Haney
你能否编辑问题并加上一个 [mcve] 吗? - user47589
我正在单元测试中运行此代码;我已经打开了“并行运行单元测试”选项。但是,即使我只运行这里失败的一个单元测试,这种情况仍会发生。 - ekolis
@ekolis 需要展示更多的代码。请展示定义和设置变量、枚举类等内容。 - Haney
你能包含更多周围的文本吗?最好能够提供完整的上下文,包括任何设置以及设置allFlags值的位置。 - Pedro
当错误发生时,您得到的完整异常消息/堆栈跟踪是什么? - Pedro
1个回答

2
我猜测问题出在你的按位比较上:

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

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

由于Enum.Parse在任何情况下都不会抛出InvalidCastException异常,并且返回一个object类型,作为调试步骤,请将该行注释掉并暂时替换为return true;,然后运行测试以查看是否会抛出异常。如果没有抛出异常,则可能需要在之前的Parse行中显式转换为枚举类型,然后再转换为int类型。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接