在本文,你将学会如何遍历并获取枚举的每一项,是一个非常实用的编程思想。文章末尾还备注有其他关于枚举的小技巧哦
使用场景
笔者在学习Kinect过程中,发现其手势枚举多达27个(不包括用户自定义的),而在某个项目中,如果这些手势全部都用上,如果无脑操作,难免不会出现下面形式的代码:
kmgr.DeleteGesture(userId, KinectGestures.Gestures.ShoulderLeftFront);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.ShoulderRightFront)
kmgr.DeleteGesture(userId, KinectGestures.Gestures.Psi);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.RaiseLeftHand);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.RaiseRightHand);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.Run);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.Stop);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.SwipeDown);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.SwipeLeft);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.SwipeRight);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.SwipeUp);
kmgr.DeleteGesture(userId, KinectGestures.Gestures.Tpose);
显然,这个枚举就是一个共通点,如果使用foreach遍历枚举并赋值,能将上述代码简化成如下样子:
foreach (KinectGestures.Gestures item in Enum.GetValues(typeof(KinectGestures.Gestures)))
{
kmgr.DeleteGesture(userId, item);
}
示例学习:
using System;
using UnityEngine;
public enum TestEnumArr {
Test_01, Test_02, Test_03, Test_04, Test_05, Test_06,
Test_07, Test_08, Test_09, Test_10, Test_11, Test_12
};
public class TestForEnum : MonoBehaviour {
void Start () {
foreach (TestEnumArr item in Enum.GetValues(typeof(TestEnumArr)))
{
DoSomeThings(item);//这个方法证明我传过去了枚举
}
}
void DoSomeThings (TestEnumArr tEnum) {
Debug.Log(tEnum.ToString());//简单演示枚举项被转过来了
switch (tEnum) //实际使用的一种情况,仅供参考
{
case TestEnumArr.Test_01:
Debug.Log("我是枚举第一项"); //演示一下,下面的不写了哈~
break;
}
}
}
动画演示:
Tips:
1、枚举+移位运算符的天配,味道会更好哟!
2、随机获得枚举某一项思路,得到Value数组,随机下标即可
3、判断枚举里面是否存在某一项
string msg="NotFound";
//int msg=100;
//HttpStatusCode msg=HttpStatusCode.Created;
Enum.IsDefined(typeof(HttpStatusCode),msg) //msg 可以是string ,也可以是数值,也可以是枚举
(int)Enum.Parse(typeof(HttpStatusCode), msg)//将string类型的msg转成枚举,然后转int类型的常数值
4、枚举也要玩出键值对的感觉(KeyValuePair)
public enum PlantState
{
None=0,
Seed =1,
Child = 24 * 3 * 2,
Midd = Child + (int)(0.5f * 7 * 2), //如乘了float类型,必须这样用上两个括号
Old = Midd + (int)(0.5f * 50 * 2)
}
int total=0;
foreach (PlantState item in Enum.GetValues(typeof(PlantState)))
{
Debug.Log(item.ToString() + (int)item); //输出:Seed1、Child144... 玩出键值对的感觉有木有!
total += (int)item;
}
- 怎么获取枚举类型的名称呢?
_type.GetType().Name
想一想:结合笔者的TimeTrigger的OnUpdate回调返回的percentage如何玩出花来,再配合有限状态机?
标签:C#、Unity3D、Kinect、Enum枚举、遍历枚举、