我正在阅读这本书C# 4.0 in a Nutshell,我认为这本书是一本很好的书,即使是高级程序员也可以作为一个很好的参考书。
我回顾了有关基础知识的章节,我发现了一个技巧,可以判断在使用标记枚举时Enum中是否定义了某个值。
该书指出使用Enum.IsDefined
对标记的枚举不起作用,并建议这样的解决方法:
static bool IsFlagDefined(Enum e)
{
decimal d;
return (!decimal.TryParse(e.ToString(), out d);
}
如果在标记的枚举中定义了某个值,则该值应返回true。
有人可以向我解释为什么会这样吗?
提前致谢:)
答案 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
。
但是为什么你的代码解析为十进制对我来说并不完全清楚。但可能整数类型不适用于基于enum
和Int64
的{{1}}。