Enum.IsDefined带有标记的枚举

时间:2011-02-09 20:21:29

标签: c# c#-4.0 enums flags

我正在阅读这本书C# 4.0 in a Nutshell,我认为这本书是一本很好的书,即使是高级程序员也可以作为一个很好的参考书。

我回顾了有关基础知识的章节,我发现了一个技巧,可以判断在使用标记枚举时Enum中是否定义了某个值。
该书指出使用Enum.IsDefined对标记的枚举不起作用,并建议这样的解决方法:

static bool IsFlagDefined(Enum e)
{
    decimal d;
    return (!decimal.TryParse(e.ToString(), out d);
}

如果在标记的枚举中定义了某个值,则该值应返回true。

有人可以向我解释为什么会这样吗?

提前致谢:)

2 个答案:

答案 0 :(得分:12)

基本上,在使用ToString属性声明的类型的任何enum值上调用[Flags]将为任何定义的值返回类似的内容:

SomeValue, SomeOtherValue

另一方面,如果enum类型中的值,则ToString将只生成该值整数<的字符串表示形式/ em> value,例如:

5

所以这意味着如果你可以将ToString的输出解析为数字(不确定作者选择decimal的原因),则不会在类型中定义它。

以下是插图:

[Flags]
enum SomeEnum
{
    SomeValue = 1,
    SomeOtherValue = 2,
    SomeFinalValue = 4
}

public class Program
{
    public static void Main()
    {
        // This is defined.
        SomeEnum x = SomeEnum.SomeOtherValue | SomeEnum.SomeFinalValue;

        Console.WriteLine(x);

        // This is not (no bitwise combination of 1, 2, and 4 will produce 8).
        x = (SomeEnum)8;

        Console.WriteLine(x);
    }
}

上述程序的输出是:

SomeOtherValue, SomeFinalValue
8

所以你可以看到建议的方法是如何工作的。

答案 1 :(得分:0)

如果不能使用标志e的组合创建ToString()的值,则默认为整数。当然,整数将解析为decimal

但是为什么你的代码解析为十进制对我来说并不完全清楚。但可能整数类型不适用于基于enumInt64的{​​{1}}。