如何定义枚举有多个值,这是另一个枚举

时间:2016-01-12 15:04:48

标签: c# enums

我有两个枚举如下。但我不知道我可以像下面那样定义枚举。我试过了。它似乎工作。我的第一个问题。我可以定义如下的枚举吗?

[Flags]
public enum SState : int
{
    ManuelPassive = 2501601,
    AutoPassive = 2501602,
    ManuelActive = 2501610,
    AutoActive = 2501611,
}

public enum SType : int
{
    All,
    Active = SState .AutoActive | SState .ManuelActive,
    Passive = SState .AutoPassive | SState .ManuelPassive,
}

我的第二个问题:如果我可以定义此枚举,如何将SType值转换为SState列表?

public statis List<SState> ToList(this SType stype)
{
    // What should I do here ? 
}

示例呼叫:

var list = SType.Active.ToList();

我希望此列表如下所示:

var list = new List<SState>{ SState.AutoActive, SState.ManuelActive };

1 个答案:

答案 0 :(得分:1)

第一个问题很好 - 只要你没有循环定义,它就会毫无问题地编译。

你的第二个问题更有趣 - 一个解决方案是使用Java推广的Type-Safe Enumeration pattern

这种模式允许你向你的枚举添加新的行为(像Swift这样的语言开箱即用,但C#和Java遗憾地不是这样)。在下面的示例中,我根据请求为您的枚举提供了ValueList属性。

void Main()
{
    Console.WriteLine(SType.Active.Value);
    Console.WriteLine(SType.Active.List);
}

[Flags]
public enum SState : int
{
    ManuelPassive = 2501601,
    AutoPassive = 2501602,
    ManuelActive = 2501610,
    AutoActive = 2501611,
}

public sealed class SType
{
    public static readonly SType Active = new SType(new List<SState>() { SState.AutoActive, SState.ManuelActive });

    public static readonly SType Passive = new SType(new List<SState>() { SState.AutoPassive, SState.ManuelPassive });

    private SType (List<SState> values)
    {
        this.Value = (int)values.Aggregate((current, next) => current | next);
        this.List = values;
    }

    public int Value { get; private set; }

    public List<SState> List { get; private set; }
}