Enum.IsDefined带有标记的枚举

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

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

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

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

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

提前致谢 :)

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

 SomeValue, SomeOtherValue 

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

 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

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

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

但是为什么你的代码解析为十进制对我来说并不完全清楚。 但是整体类型可能不适用于基于Int64UInt64 enum