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
所以你可以看到建议的方法是如何工作的.