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
。
但是为什么你的代码解析为十进制对我来说并不完全清楚。 但是整体类型可能不适用于基于Int64
和UInt64
enum
。