C# 遍历并获取枚举(Enum)每一项(包含其他小技巧)

在本文,你将学会如何遍历并获取枚举的每一项,是一个非常实用的编程思想。文章末尾还备注有其他关于枚举的小技巧哦

使用场景

笔者在学习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;
        }
  1. 怎么获取枚举类型的名称呢?
_type.GetType().Name 

想一想:结合笔者的TimeTrigger的OnUpdate回调返回的percentage如何玩出花来,再配合有限状态机?

标签:C#、Unity3D、Kinect、Enum枚举、遍历枚举、

你可能感兴趣的:(C# 遍历并获取枚举(Enum)每一项(包含其他小技巧))