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

2020-01-05 09:17:22刘景俊


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的方法更改为泛型方法: