在枚举Enum中使用Flag多选组合值
有时我们一个枚举变量 可能会包含多个枚举元素, 比如枚举类型:
public enum Week
{
None,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
在这个星期的枚举类型中,我们定义一个表示工作日的变量 weekDay 这时候我们如果想 给weekDay变量赋值多个枚举值 Monday Tuesday …… 是不可以的。
下面我们就要使用Flags来解决这样的问题,直接上代码
using UnityEngine;
using System.Collections;
using System;
[Flags] // Flags关键字允许我们在使用.net 枚举变量时,使用多个组合值
public enum Week
{
None = 0, // 在组合值中,0代表不存在
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}
public class FWeek
{
///
/// 添加枚举元素
///
/// 原始变量
/// 要增加的类型
public static void Add(ref Week w, Week[] _wArray)
{
foreach (Week _w in _wArray)
{
w = w | _w;
}
}
///
/// 移除枚举元素
///
/// 原始变量
/// 要增加的类型
public static void Remove(ref Week w, Week[] _wArray)
{
foreach (Week _w in _wArray)
{
w = w & ~_w;
}
}
///
/// 是否包含
///
/// 原始变量
/// 要增加的类型
public static bool IsContain(Week w, Week _w)
{
return 0 != (w & _w);
}
///
/// 是否为None
///
public static bool IsNone(Week w)
{
return w != Week.None;
}
}
using UnityEngine;
using System.Collections;
using System;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
Week weekDay = Week.None;
FWeek.Add(ref weekDay, new Week[] { Week.Monday, Week.Tuesday, Week.Wednesday, Week.Thursday, Week.Friday, Week.Sunday });
Debug.Log("一周工作日都有星期几:" + weekDay);
FWeek.Remove(ref weekDay, new Week[] { Week.Sunday });
Debug.Log("周日好像不是工作日:" + weekDay);
bool hasMonday = FWeek.IsContain(weekDay, Week.Monday);
Debug.Log("有没有周一: " + hasMonday);
}
}
[Flags]
enum eTest
{
OK = 0 ,
Error1 = 1,
Error2 = 2,
Error3 = 4,
}
在以上的Enum中 , 我们在判断一个 eTest 实例是否有错误 Error1 可以使用 HasFlag(eTest.Error1) 但是如果要判断 是否 OK
不能使用 HasFlag(eTest.OK) ,因为这样始终返回 True , 而要用 eTestInstance == eTest.OK 这样的语句判别
HasFlag()使用示例