我有这行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
}
答案 0 :(得分:2)
我怀疑问题在于您的按位比较:
return (((int)__allFlags & (int)__singleFlag) == (int)__singleFlag);
由于Enum.Parse
在任何情况下都不会抛出InvalidCastException
,而是返回object
类型。
作为调试步骤,注释掉该行并将其替换为return true;
,然后运行测试以查看是否引发了异常。如果不是,您可能需要在强制转换为Parse
之前在前int
行中显式转换为枚举类型。