前言:
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括甘谷網(wǎng)站建設(shè)、甘谷網(wǎng)站制作、甘谷網(wǎng)頁制作以及甘谷網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,甘谷網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到甘谷省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
反射(Reflection)是.NET提供給開發(fā)者的一個(gè)強(qiáng)大工具,盡管作為.NET框架的使用者,很多時(shí)候不會(huì)用到反射。但在一些情況下,尤其是在開發(fā)一些基礎(chǔ)框架或公共類庫時(shí),使用反射會(huì)使系統(tǒng)架構(gòu)更加靈活。
在開發(fā)中,我們常常會(huì)遇到比如有些狀態(tài)值在定義好后幾乎從不改動(dòng),這時(shí)候使用數(shù)據(jù)庫就顯得有些多余了。首先想到的一個(gè)辦法可能是在程序中創(chuàng)建一個(gè)數(shù)組來表示,此時(shí),我們遇到了使用數(shù)組可能帶來的第一個(gè)問題:不方便使用。當(dāng)數(shù)組結(jié)構(gòu)變更時(shí),可能意味著所有使用過此數(shù)組的地方的索引都發(fā)生了變更,這是我們不想看到的。
這時(shí),我們可以采用枚舉:
public enum BookingStatus { 未提交 =1, 已提交, 已取消, 已定妥 = 6 }
在實(shí)際使用中,可能需要用戶下拉選擇這些狀態(tài)值,這時(shí)就需要我們把枚舉綁定到下拉框上(此處以Combobox為例)了。大家知道,可以綁定到下拉框列表的有兩種類型:一種是實(shí)現(xiàn)了IEnumerable接口的可枚舉類型,比如ArrayList,String[],List<T>;一類是實(shí)現(xiàn)了IListSource的數(shù)據(jù)源,比如DataTable,DataSet。
可是,枚舉enum是一個(gè)基本類型,它不會(huì)實(shí)現(xiàn)任何的接口,顯然,無法直接將枚舉綁定到下拉框上,那么應(yīng)該采用什么辦法呢?
使用反射遍歷枚舉字段
要遍歷枚舉,首先就需要一個(gè)包含枚舉每個(gè)字段信息的對(duì)象,這個(gè)對(duì)象至少應(yīng)該包含兩個(gè)屬性,一個(gè)是字段的名稱,一個(gè)是字段的值,以方便后續(xù)綁定。
先看下完整的代碼:
private void Form1_Load(object sender, EventArgs e) { comboBox1.DataSource = GetDataTable(); comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "Value"; } public static DataTable GetDataTable() { Type t = typeof(BookingStatus); //創(chuàng)建類型 FieldInfo[] fieldinfo = t.GetFields(); //獲取字段信息對(duì)象集合 DataTable table = new DataTable(); table.Columns.Add("Name", typeof(String)); table.Columns.Add("Value", typeof(Int32)); foreach (FieldInfo field in fieldinfo) { if (!field.IsSpecialName) { DataRow row = table.NewRow(); row[0] = field.Name; //獲取文本字段 row[1] = (int)field.GetRawConstantValue(); //獲取int數(shù)值 table.Rows.Add(row); } } return table; } } public enum BookingStatus { 未提交 =1, 已提交, 已取消, 已定妥 = 6 }
效果:
這里大致做一個(gè)說明:Type抽象類提供了訪問類型元數(shù)據(jù)的能力,當(dāng)實(shí)例化了一個(gè)Type對(duì)象后,可以通過它的屬性和方法,獲取類型的元數(shù)據(jù)的信息,或者進(jìn)一步獲得該類型的成員的元數(shù)據(jù)信息。注意到這里,因?yàn)門ype對(duì)象總是基于某一具體類型的,并且它是一個(gè)抽象類,所以再創(chuàng)建Type類型時(shí),需要提供類型名稱或者類型的實(shí)例。程序集元數(shù)據(jù),通過Type類型就可以訪問類型的元數(shù)據(jù)信息,而訪問類型元數(shù)據(jù)的操作,就叫做反射。
使用泛型來達(dá)到代碼重用
觀察上面的代碼,如果現(xiàn)在有另一個(gè)枚舉,叫做TicketStatus,那么要將它的枚舉項(xiàng)文本和值轉(zhuǎn)換為DataTable,唯一需要改動(dòng)的就是這里:
Type t = typeof(BookingStatus); //將枚舉名稱更換
既然這樣,就可以利用泛型來實(shí)現(xiàn)代碼的重用,將返回DataTable的方法更改為泛型方法:
public static DataTable GetDataTable<T>() { Type t = typeof(T); //創(chuàng)建類型 FieldInfo[] fieldinfo = t.GetFields(); //獲取字段信息對(duì)象集合 //...............省略 return table; }
從以上代碼可以看出,綜合使用反射,泛型等技術(shù),可以極大地提高代碼的靈活性,可重用性。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。
當(dāng)前名稱:C#如何利用反射將枚舉綁定到下拉框詳解
文章源于:http://sd-ha.com/article30/jsjepo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、搜索引擎優(yōu)化、軟件開發(fā)、用戶體驗(yàn)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)