C# 利用反射将枚举绑定到下拉框
前言:反射(Reflection)是.NET提供给开发者的一个强大工具,尽管作为.NET框架的使用者,很多时候不会用到反射。但在一些情况下,尤其是在开发一些基础框架或公共类库时,使用反射会使系统架构更加灵活。
在开发中,我们常常会遇到比如有些状态值在定义好后几乎从不改动,这时候使用数据库就显得有些多余了。首先想到的一个办法可能是在程序中创建一个数组来表示,此时,我们遇到了使用数组可能带来的第一个问题:不方便使用。当数组结构变更时,可能意味着所有使用过此数组的地方的索引都发生了变更,这是我们不想看到的。
这时,我们可以采用枚举:
public enum BookingStatus
{
未提交 =,
已提交,
已取消,
已定妥 =
}
在实际使用中,可能需要用户下拉选择这些状态值,这时就需要我们把枚举绑定到下拉框上(此处以Combobox为例)了。大家知道,可以绑定到下拉框列表的有两种类型:一种是实现了IEnumerable接口的可枚举类型,比如ArrayList,String[],List<T>;一类是实现了IListSource的数据源,比如DataTable,DataSet。
可是,枚举enum是一个基本类型,它不会实现任何的接口,显然,无法直接将枚举绑定到下拉框上,那么应该采用什么办法呢?
使用反射遍历枚举字段
要遍历枚举,首先就需要一个包含枚举每个字段信息的对象,这个对象至少应该包含两个属性,一个是字段的名称,一个是字段的值,以方便后续绑定。
先看下完整的代码:
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); //创建类型
FieldInfo[] fieldinfo = t.GetFields(); //获取字段信息对象集合 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[] = field.Name; //获取文本字段
row[] = (int)field.GetRawConstantValue(); //获取int数值
table.Rows.Add(row);
}
}
return table;
}
} public enum BookingStatus
{
未提交 =,
已提交,
已取消,
已定妥 =
}
效果:
这里大致做一个说明:Type抽象类提供了访问类型元数据的能力,当实例化了一个Type对象后,可以通过它的属性和方法,获取类型的元数据的信息,或者进一步获得该类型的成员的元数据信息。注意到这里,因为Type对象总是基于某一具体类型的,并且它是一个抽象类,所以再创建Type类型时,需要提供类型名称或者类型的实例。程序集元数据,通过Type类型就可以访问类型的元数据信息,而访问类型元数据的操作,就叫做反射。
使用泛型来达到代码重用
观察上面的代码,如果现在有另一个枚举,叫做TicketStatus,那么要将它的枚举项文本和值转换为DataTable,唯一需要改动的就是这里:
Type t = typeof(BookingStatus); //将枚举名称更换
既然这样,就可以利用泛型来实现代码的重用,将返回DataTable的方法更改为泛型方法:
public static DataTable GetDataTable<T>()
{
Type t = typeof(T); //创建类型
FieldInfo[] fieldinfo = t.GetFields(); //获取字段信息对象集合 //...............省略 return table;
}
从以上代码可以看出,综合使用反射,泛型等技术,可以极大地提高代码的灵活性,可重用性。
C# 利用反射将枚举绑定到下拉框的更多相关文章
- 枚举类返回Map键值对,绑定到下拉框
有时候,页面的下拉框要显示键值对,但是不想从数据库取,此时我们可以写一个枚举类, Java后台代码 1.枚举类 import java.util.HashMap; import java.util.M ...
- winform c#绑定combobox下拉框 年度代码。
winform c#绑定combobox下拉框 年度代码. comboBox1.Items.AddRange("});//邦定数据 comboBox1.Text = DateTime.Now ...
- knockoutjs foreach array绑定 表格 下拉框绑定
转载http://desert3.iteye.com/blog/1480471 knockoutjs foreach array绑定 表格 下拉框绑定 博客分类: Javascript 动态表格使 ...
- ThinkPHP中ajax绑定select下拉框无法显示
html代码: 控制器代码: 其中的<option value="{$vo.gradeId}">{$one.gradeName}</option> 在操作过 ...
- asp.net中如何绑定combox下拉框数据(调用存储过程)
#region 绑定类型(商品类型.仓库名称) public void DataType_Bind(int _peoid) { DataTable dt_goodsname = new DataTab ...
- GridView 中绑定DropDownList ,下拉框默认选中Label的值
在GridView中,我们 有时候要绑定值. 前台绑定的代码可以这样 <asp:TemplateField HeaderText="当前状态" ItemStyle-Horiz ...
- 绑定下拉框时避免触发SelectedIndexChanged事件
在从数据库读取数据集绑定到下拉框时会立即触发其SelectedIndexChanged事件造成异常,可对其SelectedIndexChanged事件采取先解除后附加的方法解决. cmbXl_gt.V ...
- Select下拉框使用ajax异步绑定数据
<!--前端样式--> <style> #searchs { width: 200px; position: absolute; border-top: none; margi ...
- 使用poi解决导出excel内下拉框枚举项较多的问题
废话少说,直接上代码: package com.fst.attachment.controller; import java.io.FileOutputStream; import org.apach ...
随机推荐
- hog行人检测
本文主要介绍下opencv中怎样使用hog算法,因为在opencv中已经集成了hog这个类.其实使用起来是很简单的,从后面的代码就可以看出来.本文参考的资料为opencv自带的sample. 关于op ...
- LogisticRegression in MLLib
例子 iris数据训练Logistic模型.特征petal width和petal height,分类目标有三类. import org.apache.spark.mllib.classificati ...
- Flash插件flashplugin-nonfree的手动更新
Debian,nonfree库里有flashplugin-nonfree,这个就是网页浏览器的Flash插件了.不过它好像不会自动更新,每次更新网页浏览器后都会提示flashplugin版本过低.但f ...
- Windows的cmd窗口显示utf8字符
用XeLaTeX的时候,查字体需要用fc-list命令,XeLaTeX用的都是utf编码,所以fc-list输出的字体信息也是utf编码.因此需要把cmd窗口也改成utf8编码才能看到这些字体信息.U ...
- ASP.NET CORE之上传文件夹
最近闲余时间在做一个仿百度网盘的项目,其中就有一个上传文件夹的功能.查了下网上好像对这个问题的描述比较少,所以在此记录一下. 1.网上找来找去发现webkitdirectory这个东西,H5的一个新的 ...
- Android .9 图片
最初对 .9 图片不是十分理解,一些教程让人摸不到头脑. 最近重新研究终于明白了它的原理. 其实最重要的一点记住就可以了,就是 .9 图片的四条黑边的意义,每条黑边的意义都不一样: 顶部:在水平拉伸的 ...
- 36_并发编程-multiprocess模块
仔细说来,multiprocess不是一个模块而是python中一个操作.管理进程的包. 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块.由于提供的 ...
- ubuntu14中把openssh升级到7.5
经验证可用 下载相关tar.gz包,没有下载到的,可以在这里下载.http://download.csdn.net/download/songanshu/10023663 apt install -y ...
- Java - 集成开发环境Eclipse的使用方法和技巧
00 - Eclipse教程 Eclipse 教程 01 - Eclipse设置编译和运行的环境 建议编译和运行的版本保持一致,否则请特别注意: 低编译,高运行 ---> 可行. 高编译,低运行 ...
- 一步步Cobol 400上手自学入门教程04 - 过程部
过程部的作用:编写程序要执行的语句,是程序的核心. 结构: 基本语句 INITIALIZE 设置数据项的初始值 ACCEPT 接收从键盘或指定设备上获得输入数据. 例子: 当批处理文件读到调用ACCP ...