1. 程式人生 > >獲取Enum列舉值描述的幾法方法

獲取Enum列舉值描述的幾法方法

1.定義列舉時直接用中文

由於VS對中文支援的很不錯,所以很多程式設計師都採用了此方案.

缺點:1.不適合多語言 2.感覺不太完美,畢竟大部分程式設計師大部分程式碼都使用英文

2.利用自定義屬性定義列舉值的描述(部落格園大尾巴狼

缺點:不適合多語言

列舉定義:

[EnumDescription("訂單、訂單中的產品、產品項的狀態。")]
 public enum OrderStateEnum
 {
  [EnumDescription("未開始")]
  Ready = 0,
  [EnumDescription("進行中")]
  Processing,
  [EnumDescription("等待中"
)]
  Waiting,
  [EnumDescription("取消")]
  Canceled,
  [EnumDescription("完成")]
  Finished
 }

程式碼訪問:

0、獲得列舉型別的文字描述

string txt = EnumDescription.GetEnumText(typeof(OrderStateEnum));

1、獲得某個列舉值的文字描述:

string txt = EnumDescription.GetFieldText(OrderStateEnum.Processing)

2、獲得列舉中各個欄位的定義陣列:

EnumDescription[] des = EnumDescription.GetFieldTexts(typeof
(OrderStateEnum))

如果需要排序,通過他的另一個過載  

public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )

3、繫結到下拉框:

comboBox1.DataSource = EnumDescription.GetFieldTexts(typeof(OrderStateEnum));
comboBox1.ValueMember = "EnumValue";
comboBox1.DisplayMember = "EnumDisplayText";
comboBox1.SelectedValue = (int
)OrderStateEnum.Finished; //選中值
EnumDisplayText.cs 原始碼
using System;
using System.Reflection;
using System.Collections;
using System.Text;
namespace BirdSof
{
    /// <summary>
    /// 把列舉值按照指定的文字顯示
    /// <remarks>
    /// 一般通過列舉值的ToString()可以得到變數的文字,
    /// 但是有時候需要的到與之對應的更充分的文字,
    /// 這個類幫助達到此目的
    /// Date: 2006-3-25 
    /// Author: [email protected]
    /// </remarks>
    /// </summary>
    /// <example>
    /// [EnumDescription("中文數字")]
    /// enum MyEnum
    /// {
    ///        [EnumDescription("數字一")]
    ///     One = 1, 
    /// 
    ///        [EnumDescription("數字二")]
    ///        Two, 
    /// 
    ///        [EnumDescription("數字三")]
    ///        Three
    /// }
    /// EnumDescription.GetEnumText(typeof(MyEnum));
    /// EnumDescription.GetFieldText(MyEnum.Two);
    /// EnumDescription.GetFieldTexts(typeof(MyEnum)); 
    /// </example>
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
    public class EnumDescription : Attribute
    {
        private string enumDisplayText;
        private int enumRank;
        private FieldInfo fieldIno;
        /// <summary>
        /// 描述列舉值
        /// </summary>
        /// <param name="enumDisplayText">描述內容</param>
        /// <param name="enumRank">排列順序</param>
        public EnumDescription( string enumDisplayText, int enumRank )
        {
            this.enumDisplayText = enumDisplayText;
            this.enumRank = enumRank;
        }
        /// <summary>
        /// 描述列舉值,預設排序為5
        /// </summary>
        /// <param name="enumDisplayText">描述內容</param>
        public EnumDescription( string enumDisplayText )
            : this(enumDisplayText, 5) { }
        public string EnumDisplayText
        {
            get { return this.enumDisplayText; }
        }
        public int EnumRank
        {
            get { return enumRank; }
        }
        public int EnumValue
        {
            get { return (int)fieldIno.GetValue(null); }
        }
        public string FieldName
        {
            get { return fieldIno.Name; }
        }
        #region  =========================================對列舉描述屬性的解釋相關函式
        /// <summary>
        /// 排序型別
        /// </summary>
        public enum SortType
        {
            /// <summary>
            ///按列舉順序預設排序
            /// </summary>
            Default,
            /// <summary>
            /// 按描述值排序
            /// </summary>
            DisplayText,
            /// <summary>
            /// 按排序熵
            /// </summary>
            Rank
        }
        private static System.Collections.Hashtable cachedEnum = new Hashtable();
        /// <summary>
        /// 得到對列舉的描述文字
        /// </summary>
        /// <param name="enumType">列舉型別</param>
        /// <returns></returns>
        public static string GetEnumText( Type enumType )
        {
            EnumDescription[] eds = (EnumDescription[])enumType.GetCustomAttributes(typeof(EnumDescription), false);
            if ( eds.Length != 1 ) return string.Empty;
            return eds[0].EnumDisplayText;
        }
        /// <summary>
        /// 獲得指定列舉型別中,指定值的描述文字。
        /// </summary>
        /// <param name="enumValue">列舉值,不要作任何型別轉換</param>
        /// <returns>描述字串</returns>
        public static string GetFieldText( object enumValue )
        {
            EnumDescription[] descriptions = GetFieldTexts(enumValue.GetType(), SortType.Default);
            foreach ( EnumDescription ed in descriptions )
            {
                if ( ed.fieldIno.Name == enumValue.ToString() ) return ed.EnumDisplayText;
            }
            return string.Empty;
        }
        /// <summary>
        /// 得到列舉型別定義的所有文字,按定義的順序返回
        /// </summary>
        /// <exception cref="NotSupportedException"></exception>
        /// <param name="enumType">列舉型別</param>
        /// <returns>所有定義的文字</returns>
        public static EnumDescription[] GetFieldTexts( Type enumType )
        {
            return GetFieldTexts(enumType, SortType.Default);
        }
        /// <summary>
        /// 得到列舉型別定義的所有文字
        /// </summary>
        /// <exception cref="NotSupportedException"></exception>
        /// <param name="enumType">列舉型別</param>
        /// <param name="sortType">指定排序型別</param>
        /// <returns>所有定義的文字</returns>
        public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )
        {
            EnumDescription[] descriptions = null;
            //快取中沒有找到,通過反射獲得欄位的描述資訊
            if ( cachedEnum.Contains(enumType.FullName) == false )
            {
                FieldInfo[] fields = enumType.GetFields();
                ArrayList edAL = new ArrayList();
                foreach ( FieldInfo fi in fields )
                {
                    object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
                    if ( eds.Length != 1 ) continue;
                    ((EnumDescription)eds[0]).fieldIno = fi;
                    edAL.Add(eds[0]);
                }
                cachedEnum.Add(enumType.FullName, (EnumDescription[])edAL.ToArray(typeof(EnumDescription)));
            }
            descriptions = (EnumDescription[])cachedEnum[enumType.FullName];
            if ( descriptions.Length <= 0 ) throw new NotSupportedException("列舉型別[" + enumType.Name + "]未定義屬性EnumValueDescription");
            //按指定的屬性氣泡排序
            for ( int m = 0; m < descriptions.Length; m++ )
            {
                //預設就不排序了
                if ( sortType == SortType.Default ) break;
                for ( int n = m; n < descriptions.Length; n++ )
                {
                    EnumDescription temp;
                    bool swap = false;
                    switch ( sortType )
                    {
                        case SortType.Default:
                            break;
                        case SortType.DisplayText:
                            if ( string.Compare(descriptions[m].EnumDisplayText, descriptions[n].EnumDisplayText) > 0 ) swap = true;
                            break;
                        case SortType.Rank:
                            if ( descriptions[m].EnumRank > descriptions[n].EnumRank ) swap = true;
                            break;
                    }
                    if ( swap )
                    {
                        temp = descriptions[m];
                        descriptions[m] = descriptions[n];
                        descriptions[n] = temp;
                    }
                }
            }
            return descriptions;
        }
        #endregion
    }
}

下載地址:原文下載

3.NBear提供的繫結Enum到ASP.NET資料繫結控制元件的完美解決方案(部落格園Teddy

(支援第三方列舉描述,支援二進位制與過的列舉值)

EnumDescriptionAttribute.cs 原始碼

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace NBear.Common
{
    [AttributeUsage(AttributeTargets.Field, AllowMultiple=false, Inherited=true)]
    public class EnumDescriptionAttribute : Attribute
    {
        private string defaultDesc;
        public string DefaultDescription
        {
            get
            {
                return defaultDesc;
            }
            set
            {
                defaultDesc = value;
            }
        }
        public virtual string GetDescription(object enumValue)
        {
            Check.Require(enumValue != null, "enumValue could not be null.");
            
           

相關推薦

獲取Enum列舉描述方法

1.定義列舉時直接用中文 由於VS對中文支援的很不錯,所以很多程式設計師都採用了此方案. 缺點:1.不適合多語言 2.感覺不太完美,畢竟大部分程式設計師大部分程式碼都使用英文 2.利用自定義屬性定義列舉值的描述(部落格園-大尾巴狼) 缺點:不適合多語言 列舉定

webdriver獲取input元素方法

1、通過元素屬性來獲取值 String value = username.getAttribute("value"); 2、通過js來獲取值 JavascriptExecutor js = (Java

OpenCV 獲取畫素方法

http://tmjfzy.blog.163.com/blog/static/6644702520126157403724/ Fn 1 : Code 1 : int main() { //新建一個uchar型別的單通道矩陣(grayscale image

Enum列舉獲取及List的使用Demo

Enum.GetValues(enumType)、Enum.GetName(enumType, i) 2個方法 class Program { public enum Product { 飛機 = 1,

OpenCV獲取與設定畫素點的方法

Code 1 : int main() { //新建一個uchar型別的單通道矩陣(grayscale image 灰度圖) Mat m(400, 400, CV_8U, Sca

liunx下獲取網卡地址的方法

liunx下獲取網卡地址的幾種方法CentOS Linux release 7.2.1511 (Core)系統獲取網卡ipifconfig em1|awk ‘NR==2 {print $2}‘ifconfig em1|sed -n ‘2p‘|cut -d ‘ ‘ -f 10ifconfig em1|sed -

窗口間傳方法

sdn 架構設計 基本 popu 問題 剛才 text src 界面 剛開始學Winform的同學基本上都會遇到窗口傳值的問題,怎樣解決問題,事實上就是須要解決你對窗口的一個理解。 一定要記住,窗口(Form),它是一個類(Class)。!

Java Spring Controller 獲取請求參數的方法

交流 str eth req turn let oca form表單 val 技術交流群:233513714 1、直接把表單的參數寫在Controller相應的方法的形參中,適用於get方式提交,不適用於post方式提交。若"Content-Type"="applic

Spring Controller 獲取請求參數的方法

不存在 orm red ID DDU usermod ping 接收 發生 1、直接把表單的參數寫在Controller相應的方法的形參中,適用於get方式提交,不適用於post方式提交。若"Content-Type"="application/x-www-form-ur

Java獲取文件路徑的方法

ews XML 獲取 mil 路徑 etc ans nbsp tin 第一種: File f = new File(this.getClass().getResource("/").getPath()); System.out.print

Android中Intent傳方法

1.使用putextra    Intent intent = new Intent(); intent.putExtra("test","asdf"); intent.se

python找出字典中value最大方法

假設定義一字典,m = {"a":3,"e":6,"b":2,"g":7,"f":7,"c":1,"d":5},在不知道key的情況下如何找出字典中value最大的所有key-value對?下面討論幾種方法。 1)通過m.values()和max()函式 第一步,通過max()函式找到字典中的value最

【轉】PHP獲取重定向URL的方法

有時候我們會在開發中,經常會遇到有URL 301或 302重定向的情況,這時候我們可能需要獲取重定向之後的url,下面我們介紹一下幾種獲取重定向url的方法: 1、用get_headers函式php自帶的get_headers函式可以獲取伺服器響應一個HTTP請求所傳送的所有標頭,我們可以嘗試用該函式實現。

C#中WinForm窗體間相互傳方法

本文最早釋出在百度空間裡,但百度空間取消了,轉到這裡來。文章雖然有點老,但對學習C#的小夥伴應該還用得上。 1.通過建構函式 特點:傳值是單向的(不可以互相傳值),實現簡單 實現程式碼如下: 在窗體Form2中 int value1; string value2;

java後臺list集合傳到前臺,再取方法

1.在jsp頁面中巢狀 java程式碼: 首先jsp頁面中匯入java的工具類 <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEnco

C#獲取程式執行路徑的方法

通過控制檯程式打印出每種方法的結果 static void Main(string[] args) { Console.WriteLine("typeof(Program).Assembly.Location:\r\n{0}",

php獲取檔案mime型別的方法

      MIME型別就是設定某種副檔名的檔案用一種應用程式來開啟的方式型別,當該副檔名檔案被訪問的時候,瀏覽器會自動使用指定應用程式來開啟。多用於指定一些客戶端自定義的檔名,以及一些媒體檔案開啟方式。 php獲取檔案mime型別有以下幾種方法: 1、mime_cont

【java】對被final修飾的變數進行賦方法

對被final修飾的變數進行賦值的幾種方法 這是精華: 因為當類被載入進記憶體的時候,這個屬性並沒有給其分配記憶體空間,而只是定義了一個變數,只有當類被例項化的時候這個屬性才被分配記憶體空

VC++獲取外網IP的方法

一、CHttpFile方式 #include <afxinet.h> int GetNetIp(char *IpAddr) { try  {   CInternetSession session("HttpClient");   char * url = "ht

微信小程式 傳方法總結,百分百會用到

微信小程式 傳值取值 小程式裡常見的取值有以下幾種,一個完整的專案寫下來,用到的概率幾乎是100%。 列表index下標取值 頁面傳值 form表單取值 列表index下標取值 實現方式是:data-index=”{{index}}”挖坑及e.cu