6

如果枚举已经用属性装饰,它看起来Enum.GetName()不起作用。[Flags]

文档未指定与此限制相关的任何内容。

我注意到调试器能够显示类似Tree | 水果。有没有办法检索描述组合标志的文本字符串?


以下代码显示Red

public enum FavoriteColor
{
    Red,
    Blue,
    WeirdBrownish,
    YouDoNotEvenWantToKnow,
}

var color = FavoriteColor.Red;
Console.WriteLine(Enum.GetName(typeof(FavoriteColor), color));   // => "Red"

而这个不输出任何东西....

[Flags]
public enum ACherryIsA
{
    Tree = 1,
    Fruit = 2,
    SorryWhatWasTheQuestionAgain = 4,
}

var twoOfThree = ACherryIsA.Fruit | ACherryIsA.Tree;
Console.WriteLine(Enum.GetName(typeof(ACherryIsA), twoOfThree));   // => ""
4

3 回答 3

9
string s = twoOfThree.ToString();

或者:

Console.WriteLine(twoOfThree);

如果您想手动执行此操作,请将值拆分为位,并测试您需要添加哪些标志来制作该标志。有点编码,但不多。

于 2012-06-08T12:40:47.403 回答
4

为什么不twoOfThree.ToString()呢?

twoOfThree 等于 3,并且 ACherryIsA 没有与此值相关的枚举成员...

于 2012-06-08T12:43:35.763 回答
1

如果标志是互斥的,您可以获得如下名称:

((ACherryIsA[])Enum.GetValues(typeof(ACherryIsA)))
.Where(e => twoOfThree.HasFlag(e))

演示:

var twoOfThree = ACherryIsA.Fruit | ACherryIsA.Tree;
Console.WriteLine(
    "Name: " + String.Join(
        ",", 
        ((ACherryIsA[])Enum.GetValues(typeof(ACherryIsA)))
        .Where(e => twoOfThree.HasFlag(e))
    )
);   // => Name: Tree,Fruit

但是,如果标志重叠,这会表现得很奇怪:

[Flags]
public enum ACherryIsA
{
    Tree = 1,
    Fruit = 2,
    SorryWhatWasTheQuestionAgain = 4,
    FruitTree = Tree | Fruit,
}

public static void Main()
{
    var twoOfThree = ACherryIsA.Fruit | ACherryIsA.Tree;
    Console.WriteLine(
        "Name: " + String.Join(
            ",", 
            ((ACherryIsA[])Enum.GetValues(typeof(ACherryIsA)))
            .Where(e => twoOfThree.HasFlag(e))
        )
    );   // => Name: Tree,Fruit,FruitTree
}
于 2019-01-08T00:40:01.020 回答