枚舉轉中文,通過反射方法與描述的方式獲取

示例:

有人為了顯示中文,這樣定義枚舉嗎?

publicenum TimeOfDay
{
上午,
下午,
晚上
};

這樣定義,很別扭,特別是在使用的時候,

比如,this.Time = TimeOfDay.上午;

而且你會逐漸發現它的局限性。

?

枚舉定義很頭疼:

在系統開發中,我們經常使用枚舉,但是定義枚舉是個頭疼的問題。

按照習慣我們習慣將枚舉項定義為英語,但是,在使用的時候,特別針對國內客戶的時候,如果顯示的英文,則不符合要求,不易于用戶使用。

盡管現在枚舉定義也能定義中文枚舉項,但在優雅的英文代碼中穿插著中語,確實很不爽。如果涉及多語,很難擴展。

也有人經常用到常量來代替枚舉,但這種方法在系統開發中不太可取,具體見:枚舉與常量。

?

解決方案:

?

為了方便用戶使用,?希望能夠找到一種比較好的方法,將枚舉轉為我們想要的集合。

枚舉的定義中加入描述,如果要支持多語,則直接修改枚舉描述即可。也不用修改其他代碼。

通過反射思想,得到針對某一枚舉類型的描述。具體實現起來,有如下代碼中的三個不同的的方式。

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Reflection;
using System.ComponentModel;namespace EnumApp
{class Program{static void Main(string[] args){NameValueCollection nvc = GetNVCFromEnumValue(typeof(TimeOfDay));Console.WriteLine("1. 反射方式對TimeOfDay結構體的羅列:");foreach (string key in nvc.Keys){Console.WriteLine(string.Format(key + ": {0}", nvc[key]));}Console.WriteLine("\n2. 直接方式1,對TimeOfDay結構體的羅列:");Dictionary<string, string> dic = GetEnumDic(typeof(TimeOfDay));foreach (string key in dic.Keys){Console.WriteLine(key + ":{0}", dic[key]);}Console.WriteLine("\n3. 直接方式2,對TimeOfDay結構體中某一項的描述:");Console.WriteLine(string.Format(TimeOfDay.Moning.ToString() + ":{0}", GetEnumDes(TimeOfDay.Moning)));}/// <summary>/// 從枚舉類型和它的特性讀出并返回一個鍵值對/// </summary>/// <param name="enumType">Type,該參數的格式為typeof(需要讀的枚舉類型)</param>/// <returns>鍵值對</returns>public static NameValueCollection GetNVCFromEnumValue(Type enumType){System.Reflection.FieldInfo[] fields;string strText, strValue;NameValueCollection nvc = new NameValueCollection();Type typeDescription = typeof(DescriptionAttribute);fields = enumType.GetFields();foreach (FieldInfo field in fields){if (field.FieldType.IsEnum){strValue = ((int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null)).ToString();object[] arr = field.GetCustomAttributes(typeDescription, true);if (arr.Length > 0){DescriptionAttribute aa = (DescriptionAttribute)arr[0];strText = aa.Description;}else{strText = field.Name;}nvc.Add(strValue, strText);}}return nvc;}/// <summary>/// 返回 Dic<枚舉項,描述>/// </summary>/// <param name="enumType"></param>/// <returns>Dic<枚舉項,描述></returns>public static Dictionary<string, string> GetEnumDic(Type enumType){Dictionary<string, string> dic = new Dictionary<string, string>();FieldInfo[] fieldinfos = enumType.GetFields();foreach (FieldInfo field in fieldinfos){if (field.FieldType.IsEnum){Object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);dic.Add(field.Name, ((DescriptionAttribute)objs[0]).Description);}}return dic;}/// <summary>/// 獲得某個枚舉項的描述/// </summary>/// <param name="value"></param>/// <returns></returns>public static string GetEnumDes(object value){FieldInfo fieldinfo = value.GetType().GetField(value.ToString());Object[] objs = fieldinfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);if (objs == null || objs.Length == 0){return value.ToString();}else{return ((DescriptionAttribute)objs[0]).Description;}}}public enum TimeOfDay{[Description("上午")]Moning = 0,[Description("下午")]Afternoon,[Description("晚上")]Evening,};//public enum TimeOfDays//{//    上午,//    下午,//    晚上//};
}
View Code

?

或者通過下載文件,直接進行測試。EnumDecriptionGet.rar

?

?

?

參考文章

?

枚舉顯示中文問題

?

?

轉載于:https://www.cnblogs.com/arxive/p/6285718.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394149.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java語言最新實用案例教程_Java 語言實用案例教程

基本信息書名:Java 語言實用案例教程出版價格&#xff1a;48元作者:常玉慧, 王秀梅出版社&#xff1a;科學出版社出版日期&#xff1a;2016-10-1ISBN&#xff1a;9787030497383字數&#xff1a;387000頁碼&#xff1a;235版次&#xff1a;版裝幀&#xff1a;平裝開本&#xff1…

(轉)Java隨機數

1 隨機數的三種產生方式 本章先講解Java隨機數的幾種產生方式&#xff0c;然后通過示例對其進行演示。 廣義上講&#xff0c;Java中的隨機數的有三種產生方式&#xff1a; (01). 通過System.currentTimeMillis()來獲取一個當前時間毫秒數的long型數字。(02). 通過Math.random()…

leetcode105. 從前序與中序遍歷序列構造二叉樹(遞歸)

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意: 你可以假設樹中沒有重復的元素。例如&#xff0c;給出前序遍歷 preorder [3,9,20,15,7] 中序遍歷 inorder [9,3,15,20,7] 返回如下的二叉樹&#xff1a;3/ \9 20/ \15 7代碼 /*** Definition for a binary tree node.*…

途虎養車三個創始人_3個來自非常規創始人的獲獎技術和產品見解

途虎養車三個創始人by Henry通過亨利 3個來自非常規創始人的獲獎技術和產品見解 (3 Winning Technology & Product Insights from WeChat’s unconventional founder) Intro: The writer is a current PMLinkedIn. Formerly he worked as a growth engineer Facebook. he …

Powershell-創建Module

1.找到默認module路徑&#xff0c;ISE啟動時自動加載默認領下的Module代碼。 $env:PSModulePath 2.在其中一個默認路徑下創建個文件夾&#xff0c;在文件夾下創建一個.psm1后綴文件&#xff0c;注意文件夾名字與文件名一樣。 3.在.psm1文件中寫入函數代碼。 4.重啟ISE自動加載m…

android是java_為什么大家都用JAVA寫android程序

您好&#xff0c;1、原始類型&#xff1a;v void 只能用于返回值類型Z booleanB byteS shortC charI intJ long(64位)F floatD double(64位)對象類型&#xff1a;Lpackage/name/ObjectName相當于java中的package.name.ObjectName解釋如下&#xff1a;L&#xff1a;表示這是一個…

preserve log什么意思_一些有意思的JavaScript代碼片段

Javascript是一門很靈活的語言&#xff0c;我們可以使用它動態地實現各種各樣的功能。但是動態帶來便利的同時&#xff0c;也存在一些令人費解的行為&#xff0c;稍不注意就會進入誤區一個接著一個的坑。雖然我使用JavaScript的時間還不算長&#xff0c;也是遇到了一些有意思的…

快速排序——Java

快排的思想想必大家都懂&#xff0c;前后兩個指針&#xff0c;向中間靠攏。我這個partition函數能保證所有相同的數都被比較一次&#xff0c;靠攏在一起。 代碼&#xff1a; public class Main { public static int[] partition1(int[] arr, int begin, int end, int pivotVal…

預處理器sass_Sass — Web的預處理器裝飾

預處理器sass美學的重要性&#xff0c;其影響以及實現這一目標的工具。 (Importance of aesthetics, its impact, and tool to achieve it.) I remember as a child, every time I’d walk up to a bakery, I’d choose the pastries with the most beautiful toppings. Only a…

leetcode971. 翻轉二叉樹以匹配先序遍歷(dfs)

給定一個有 N 個節點的二叉樹&#xff0c;每個節點都有一個不同于其他節點且處于 {1, …, N} 中的值。 通過交換節點的左子節點和右子節點&#xff0c;可以翻轉該二叉樹中的節點。 考慮從根節點開始的先序遍歷報告的 N 值序列。將這一 N 值序列稱為樹的行程。 &#xff08;回…

【BZOJ3932】[CQOI2015]任務查詢系統 主席樹

【BZOJ3932】[CQOI2015]任務查詢系統 Description 最近實驗室正在為其管理的超級計算機編制一套任務管理系統&#xff0c;而你被安排完成其中的查詢部分。超級計算機中的任務用三元組(Si,Ei,Pi)描述&#xff0c;(Si,Ei,Pi)表示任務從第Si秒開始&#xff0c;在第Ei秒后結束&…

沖刺第一天

任務板 未開始 進行中已完成 劉曉杰&#xff1a;找回密碼界面 頁面風格優化 劉曉杰&#xff1a;滑動歡迎界面/加載界面 預計時間&#xff1a;5.5h 馮晨&#xff1a;找回密碼功能 發布動態界面 馮晨&#xff…

杭電1003 java_杭電ACM1003題怎么理解?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓http://acm.hdu.edu.cn/showproblem.php?pid1003Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 99208 Accepted Submission(s): 22835Problem DescriptionGiven…

ubtunu打開firefox_如何在Firefox(在Lubuntu中)中打開“apt”鏈接?

問題描述Ask Ubuntu上的許多答案都直接指向在Ubuntu軟件中心中在Xubuntu中打開的this之類的鏈接。在Lubuntu中&#xff0c;我收到此錯誤消息&#xff1a;在Firefox-Preferences中&#xff0c;應用程序看不到類似于apt的東西來關聯程序等。在Chromium或Opera中打開相同的鏈接&am…

web api json_有關使用JSON Web令牌保護無服務器API的速成班

web api jsonWhat a mouthful of a title. Wouldn’t you agree? In this walkthrough you’ll learn about securing your Serverless endpoints with JSON web tokens.這么大的頭銜。 你不同意嗎&#xff1f; 在本演練中&#xff0c;您將學習如何使用JSON Web令牌保護無服務…

【python之路14】發送郵件實例

1、發郵件的代碼 from email.mime.text import MIMETextfrom email.utils import formataddrimport smtplibmsg MIMEText(郵件內容,plain,utf-8)msg[from] formataddr([sunshuhai,25193qq.com])msg[to] formataddr([走人,252222222qq.com])msg[Subject] 主題server smtpli…

蘋果內存取證工具volafox

2019獨角獸企業重金招聘Python工程師標準>>> 蘋果內存取證工具volafox volafox是一款針對蘋果內存取證的專用工具。該工具使用Python語言編寫。該工具內置了overlay data數據&#xff0c;用戶可以直接分析蘋果10.6-10.11的各種內存鏡像文件。該工具提供28個子命令&a…

leetcode513. 找樹左下角的值(dfs)

給定一個二叉樹&#xff0c;在樹的最后一行找到最左邊的值。 代碼 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {int maxL0,maxN0;pu…

Flutter實戰視頻-移動電商-45.詳細頁_說明區域UI編寫

45.詳細頁_說明區域UI編寫 pages/details_page/details_expain.dart 詳情頁面引用組件 效果展示&#xff1a; 最終代碼&#xff1a; import package:flutter/material.dart; import package:flutter_screenutil/flutter_screenutil.dart;class DetailsExplain extends Stateles…

win10java怎么運行_win10系統電腦怎樣才可以運行Java開發

展開全部安裝jdk&#xff0c;jdk下載地址&#xff1a;網頁鏈接 根據電腦系統選擇對應版本。32/64安裝時候&#xff0c;安裝路徑可以默認&#xff0c;也可以自己指定。我個人喜歡安裝到非系統盤&#xff0c;比如D盤。jdk安裝后&#xff0c;會彈出jre安裝界面&#xff0c;路徑同樣…