我有两个枚举如下。但我不知道我可以像下面那样定义枚举。我试过了。它似乎工作。我的第一个问题。我可以定义如下的枚举吗?
[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 };
答案 0 :(得分:1)
第一个问题很好 - 只要你没有循环定义,它就会毫无问题地编译。
你的第二个问题更有趣 - 一个解决方案是使用Java推广的Type-Safe Enumeration pattern。
这种模式允许你向你的枚举添加新的行为(像Swift这样的语言开箱即用,但C#和Java遗憾地不是这样)。在下面的示例中,我根据请求为您的枚举提供了Value
和List
属性。
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; }
}