Enum.IsDefined带有标记的枚举

gil*_*lyb 8 c# enums flags c#-4.0

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

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

static bool IsFlagDefined(Enum e)
{
    decimal d;
    return (!decimal.TryParse(e.ToString(), out d);
}
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢 :)

Dan*_*Tao 12

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

SomeValue, SomeOtherValue
Run Code Online (Sandbox Code Playgroud)

另一方面,如果enum类型中定义值,则ToString只会生成该值的数值的字符串表示形式,例如:

5
Run Code Online (Sandbox Code Playgroud)

所以这意味着如果你可以将输出解析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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出是:

SomeOtherValue, SomeFinalValue
8

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