簡體   English   中英

Enum.IsDefined帶有標記的枚舉

[英]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

但是為什么你的代碼解析為十進制對我來說並不完全清楚。 但是整體類型可能不適用於基於Int64UInt64 enum

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM