枚举扩展
枚举扩展的类名为 EnumExtension
,是基于枚举类型的扩展。
1、获取说明文本
枚举可以使用 EnumDescriptAttribute
或 DescriptAttribute
特性进行修饰,使枚举值具有了文本描述。下面的枚举定义了几种交通方式,每个枚举值都使用文本进行修饰。如定义枚举如下:
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: 老年男人