2020年4月17日 星期五

C# String型別Emun 多Emun 抓取為利用泛型對應欄位名稱 或抓取列舉數值

因自己犯傻 記錯泛行方式
所以做個紀錄
建立兩個範例
        enum enumRemoteCommand
        {
            [Description("REMOTE")]
            REMOTE = 1,
            [Description("LOCAL")]
            LOCAL = 2,
            [Description("Offline")]
            Offline = 3,
       
            Length,
        }
        public enum enumCEID
        {

            [Description("Equipment Status Change")]
            EquipmentStatusChange = 1,
            [Description("Procss Program Modify")]
            ProcssProgramModify = 2,
            [Description("Panel Process Start")]
            PanelProcessStart = 3,
            [Description("Panel Process End")]
            PanelProcessEnd = 4,
       
            Length,
        }

建立方法
        /// <summary>
        /// 抓取現有字串在emun第幾個數值
        /// </summary>
        /// <param name="stTemp"></param>
   
        public int iGetEnumNum<T>(string stTemp) where T : Enum
        {
            int i = 0;
            foreach (T en in Enum.GetValues(typeof(T)))
            {
                FieldInfo fi = en.GetType().GetField(en.ToString());
                i++;//初始值1開始所以先++
                if (fi == null)
                    return 0;
                object[] ob = fi.GetCustomAttributes(typeof(DescriptionAttribute), true);
                if (ob != null && ob.Length > 0 && ((DescriptionAttribute)ob[0]).Description.ToUpper()
                    == stTemp.ToUpper()) return i;
            }
            return 0;
        }

 /// <summary>
        /// 找到欄位名稱
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <returns></returns>
        public string GetEmunDescription<T>(string value) where T : Enum
        {
            Type type = typeof(T);
            var name = Enum.GetNames(type)
                            .Where(f => f.Equals(value, StringComparison.CurrentCultureIgnoreCase))
                            .Select(d => d)
                            .FirstOrDefault();

            //// 找無相對應的列舉
            if (name == null)
            {
                return string.Empty;
            }

            //// 利用反射找出相對應的欄位
            var field = type.GetField(name);
            //// 取得欄位設定DescriptionAttribute的值
            var customAttribute = field.GetCustomAttributes(typeof(DescriptionAttribute), false);

            //// 無設定Description Attribute, 回傳Enum欄位名稱
            if (customAttribute == null || customAttribute.Length == 0)
            {
                return name;
            }

            //// 回傳Description Attribute的設定
            return ((DescriptionAttribute)customAttribute[0]).Description;
        }

使用方法
      private void button1_Click(object sender, EventArgs e)
        {
            int i= iGetEnumNum<enumRemoteCommand>("REMOTE");
            string ss= GetCEIDDescription<enumRemoteCommand>("REMOTE");
            string ss2 = GetCEIDDescription<enumCEID>(enumCEID.CurrentRecipeReport.ToString());
            Console.WriteLine(i +" "+ss+ " "+ss2);
        }

沒有留言:

張貼留言