枚举扩展


  枚举扩展的类名为 EnumExtension,是基于枚举类型的扩展。


1、获取说明文本

  枚举可以使用 EnumDescriptAttributeDescriptAttribute 特性进行修饰,使枚举值具有了文本描述。下面的枚举定义了几种交通方式,每个枚举值都使用文本进行修饰。如定义枚举如下:

public enum TrafficTools
{
    [EnumDescription("步行")]
    Walking,
    [EnumDescription("汽车")]
    Automobile,
    [EnumDescription("火车")]
    Train,
    [EnumDescription("轮船")]
    Ship,
    [EnumDescription("飞机")]
    Aeroplane
}

  GetDescription 方法用于获取枚举值对应的文本描述。

[TestMethod]
public void TestGetDesc()
{
    Assert.AreEqual("汽车", TrafficTools.Automobile.GetDescription());
}

2、获取说明文本列表

  GetEnumList 方法将得到一个枚举值与文本组成的字典。

[TestMethod]
public void GetEnumList()
{
    foreach (var item in typeof(TrafficTools).GetEnumList())
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }
}

  输出结果为:

0: 步行
1: 汽车
2: 火车
3: 轮船
4: 飞机

  EnumDescriptionAttribute 还允许使用 Flags 参数进行过滤。该 Flags 与 FlagsAttribute 按位运算相似,如以下的枚举分别设定了 Flags 值:

public enum PeopleType
{
    [EnumDescription("小女孩", Flags = 5)]
    LittleGirl,
    [EnumDescription("小男孩", Flags = 6)]
    LittleBoy,
    [EnumDescription("青年女人", Flags = 41)]
    AdultGirl,
    [EnumDescription("青年男人", Flags = 42)]
    AdultBoy,
    [EnumDescription("老年女人", Flags = 49)]
    OldGril,
    [EnumDescription("老年男人", Flags = 50)]
    OldBoy
}

  下面来说说Flags值是怎么计算出来的。

  首先是标志的取值:取 1 表示男性,取 2 表示女性,取 4 表示小孩,取 8 表示青年人,取 16 表示老年,取 32 表示成人。注意,标记的取值应以 2 的 n 次方递增。

  然后分别使用 或 运算计算出每个枚举值的Flags值。

类别 计算公式
小女孩 1 或 4 5
小男孩 2 或 4 6
青年女人 1 或 8 或 32 41
青年男人 2 或 8 或 32 42
老年女人 1 或 16 或 32 49
老年男人 2 或 16 或 32 50

  这样,可以分别使用这些标记获得相应的列表:

[TestMethod]
public void GetEnumListByFlag()
{
    Console.WriteLine("--女性--");
    foreach (var item in typeof(PeopleType).GetEnumList(1))
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }
    Console.WriteLine("--小孩--");
    foreach (var item in typeof(PeopleType).GetEnumList(4))
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }
    Console.WriteLine("--成年人--");
    foreach (var item in typeof(PeopleType).GetEnumList(32))
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }
}

  输出结果为:

--女性--
0: 小女孩
2: 青年女人
4: 老年女人
--小孩--
0: 小女孩
1: 小男孩
--成年人--
2: 青年女人
3: 青年男人
4: 老年女人
5: 老年男人