我们相见了利用数组恐怕带给的首先个难题

前言:反射(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
    }

 

效果:图片 1

那边大致做三个验证: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;
        }

从以上代码能够看见,综合选拔反射,泛型等手艺,能够极大地进步代码的八面见光,可重用性。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website