獲取Enum列舉值描述的幾法方法
1.定義列舉時直接用中文
由於VS對中文支援的很不錯,所以很多程式設計師都採用了此方案.
缺點:1.不適合多語言 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