C#如何利用反射将枚举绑定到下拉框详解

作者:孤者自清 时间:2022-09-12 01:48:09 

前言:

反射(Reflection)是.NET提供给开发者的一个强大工具,尽管作为.NET框架的使用者,很多时候不会用到反射。但在一些情况下,尤其是在开发一些基础框架或公共类库时,使用反射会使系统架构更加灵活。 

在开发中,我们常常会遇到比如有些状态值在定义好后几乎从不改动,这时候使用数据库就显得有些多余了。首先想到的一个办法可能是在程序中创建一个数组来表示,此时,我们遇到了使用数组可能带来的第一个问题:不方便使用。当数组结构变更时,可能意味着所有使用过此数组的地方的索引都发生了变更,这是我们不想看到的。

这时,我们可以采用枚举:


public enum BookingStatus
{
未提交 =1,
已提交,
已取消,
已定妥 = 6
}

在实际使用中,可能需要用户下拉选择这些状态值,这时就需要我们把枚举绑定到下拉框上(此处以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[0] = field.Name; //获取文本字段
    row[1] = (int)field.GetRawConstantValue(); //获取int数值
    table.Rows.Add(row);
   }
  }
  return table;
 }
}

public enum BookingStatus
{
 未提交 =1,
 已提交,
 已取消,
 已定妥 = 6
}

效果:

C#如何利用反射将枚举绑定到下拉框详解

这里大致做一个说明: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;
 }

从以上代码可以看出,综合使用反射,泛型等技术,可以极大地提高代码的灵活性,可重用性。

来源:https://www.cnblogs.com/Liyuting/archive/2018/07/09/9278793.html

标签:c#,反射,枚举
0
投稿

猜你喜欢

  • Java集合Stream流操作的基本使用教程分享

    2023-09-01 01:05:03
  • 详解Mybatis注解写法(附10余个常用例子)

    2023-01-19 03:39:53
  • springboot项目启动的时候参数无效的解决

    2022-09-03 14:50:29
  • 解析.NET中几种Timer的使用

    2023-05-21 17:27:53
  • springboot的yml配置文件通过db2的方式整合mysql的教程

    2023-08-06 04:28:55
  • 聊聊Spring Cloud Gateway过滤器精确控制异常返回问题

    2022-06-23 01:04:14
  • Java封装的实现访问限定符、包

    2023-03-20 07:08:48
  • 浅析Java中的内存泄漏

    2023-12-19 02:29:02
  • 每日六道java新手入门面试题,通往自由的道路

    2023-11-13 16:22:29
  • hashCode方法的使用讲解

    2022-11-12 15:29:37
  • java二叉查找树的实现代码

    2022-08-12 02:36:43
  • Activity取消界面切换的默认动画方法(推荐)

    2021-05-23 12:12:52
  • springboot全局异常处理代码实例

    2023-02-05 20:41:36
  • Java日常练习题,每天进步一点点(13)

    2023-12-25 15:48:06
  • Android studio设置文件头定制代码注释的方法

    2021-07-23 16:52:41
  • Input系统之InputReader处理按键事件详解

    2023-11-09 20:57:05
  • Java实现十进制与二进制互转的示例详解

    2022-04-02 07:40:56
  • C#中事件只能在内部调用的原因分析

    2023-08-09 05:07:00
  • Android 自定义view和属性动画实现充电进度条效果

    2023-08-24 00:18:37
  • Android 用 camera2 API 自定义相机

    2023-04-30 11:29:37
  • asp之家 软件编程 m.aspxhome.com