![](/img/trans.png)
[英]Enum.TryParse and Enum.IsDefined returns false for char Enums
[英]Enum.IsDefined with flagged enums
我現在正在讀一本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
將僅生成該值的整數值的字符串表示形式,例如:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.