反射的项目实战,将枚举转换成列表的办法

来源:互联网 发布:淘宝店装修 编辑:程序博客网 时间:2024/06/07 13:56

前篇我们讲了反射的一般应用,我们试着在实际项目中使用它

 

反射的妙用

考虑这样一个场景,在一个物料编辑界面,有一个物料类型字段需要输入,那么将给用户提供物料类型的下拉列表,这样一张表, 可以将表保存到后台数据库,也可以保存为一个枚举,自己喜欢。如下所示:

ItemType                                                             枚举 EmItemType

1 TypeName                                                                         产品=0

2 ID,其中ID列是唯一的                                            半成品=1

                                                                                                      原料=2

                                                                                          END Enum

 

那么界面上的下拉框将绑定到这个列表,表和枚举使用如下

表的绑定(只做演示,所以代码粗糙,只想给大家提供思路)

Imports System.Data.SqlClient

Using cn As New _ SqlConnection("DataSource=192.168.18.233;InitialCatalog=AdventureWorks;Integrated Security=True")

            cn.Open()

            Using cmd As New SqlCommand("select * from Production.ProductCategory", cn)

                Using adp As New SqlDataAdapter(cmd)

                    adp.Fill(mDS)

                End Using

            End Using

        End Using

 

        With Me.ComboBox1

            .DropDownStyle = ComboBoxStyle.DropDownList

            .DisplayMember = "Name"

            .ValueMember = "ProductCategoryID"

            .DataSource = mDS.Tables(0)

         End With

枚举的绑定

1.       定义一个枚举EmItemType,见上文

2.       公开一个tblItemType的函数,定义如下

Public Function tblItemType () As InfoList

        Dim emIT As EmItemType

        Dim mType As Type =  emIT.Gettype

        Dim fis() As System.Reflection.FieldInfo = mT.GetFields(BindingFlags.Public Or _ BindingFlags.Static)  ‘这里用到OR运算,待会我们介绍他的原理,fis()是枚举的所有项的信息

        '生成数据列表

       Dim list As InfoList = InfoList.NewInfoList  ‘这里的infolist是我自定义的,下面有说明

        Dim item As Info ‘这个是infolist里的项

        For i As Integer = 0 To fis.Length - 1

            item = list.AddNew ‘调用infolistadd方法返回一个info

            item.Value = fis(i).GetValue(emIT)  ‘关键,取得枚举项的值

            item.Name = My.Resources.ResourceManager.GetString(fis(i).Name)

            item.Code = Format(i + 1, "00")

            item.ID = dr.Value

        Next

        Return list

End Function

上面这个函数中,将枚举类通过反射来取得枚举内部的成员信息,不管是公开的还是私有的信息,取出了字段列表后将这些字段信息保存到一个自定义的列表(Item对象是InfoList列表的强类型对象)。其中特别值得注意的是,VALUE属性保存的是枚举的012三个值(看上面的枚举定义),而NAME属性保存的是枚举项的名字,包括产品,半成品,原料(这里使用了My.Resources.ResourceManager.GetString(fis(i).Name),这样就支持你的界面可以支持多种不同的语言,只要你在项目的资源列表那里添加了英文和日文的对照,则可以传递英文字符作为参数让显示出来的列表是日文,你添加了英文和中文的对照,则显示列表可以是中文,右键我的项目/资源/添加一项 名称为Project 值为 项目,则My.Resources.ResourceManager.GetString(Project)将返回项目文本) ,而Code属性保存的是该字段的编码信息,他的作用是提供列表的搜索功能(想象你的列表有很多项,假如客户输入其中一个匹配项就自动找到与此匹配的项),对于列表的搜索和多语言的开发迟点再专题来讲。

好了,看看InfoListInfo类的定义吧,之所以不把这些枚举信息保存到普通的表,是因为我们保存到集合可以支持更多丰富的功能。

Public Class InfoList 这是个泛型类,接下来我还会讲泛型的使用

     Inherits system.compentmodel.bindinglist(of Info)

End class

Infolist类,其中包含了 增加,删除,查找项以及创建,筛选列表等方法,另外还有一些事件,支持当往列表增加或移除项时,以及列表项的属性更改时的事件等。

Public class Info

Info类包括四个变量以及这些变量公开的属性 mID,mValue,mName,mCode这几个变量的作用,ID是唯一标识一项的,VALUE是存储列表的值,NAME是存储列表项的名字,它支持多语言(语言信息是作为资源保存在项目里面的),CODE是存储项的编码信息,你可以写个自定义函数来生成编码,编码的作用是可以让你在界面那里提供用户输入时自动找出匹配的功能。

那么枚举的绑定代码

还记得Public Function tblItemType () As InfoList吗。

With Me.ComboBox1

            .DropDownStyle = ComboBoxStyle.DropDownList

            .DisplayMember = "Name"

            .ValueMember = "ProductCategoryID"

            .DataSource = tblItemType  ‘这里调用该函数即可取得列表了。

 End With

有个小提醒,假如你这个物料编辑界面保存好了,那么下次打开该界面的时候,列表应该自动显示保存后的项,只需要将控件的SelectedValue属性绑定到Info对象的VALUE属性即可

Dim bd as new binding (“SelectedValue”,me.combobox1,tblitemtype,”Value”) 参数1是控件属性,参数2是控件名,参数3是数据源,参数4是数据源列表项的VALUE属性,因为我们要保存的都是VALUE而不是显示在界面的NAME所以绑定后,不管用户选择了哪一项,我们都能保存到该项的值。我们这里用到了简单绑定,对于像网格那样的绑定,以后将讲其原理。

 

有个疑问留给大家,不知道大家有没有用过按位运算,假如你要查询产品和半成品的记录或者是半成品和原料等组合查询,那么如何通过枚举来达到呢?

回头看看我刚才写的枚举转成列表的函数中出现了这么一句

Dim fis() As System.Reflection.FieldInfo = mT.GetFields(BindingFlags.Public Or _ BindingFlags.Static)

其中的BindingFlags.Public Or  BindingFlags.Static 可以看到,有两个枚举进行了OR运算。大家都知道这代表或者的意思,那么如何从字段列表中过滤出Public或者Static呢,原理是什么呢?由于按位运算又是个主题,我将它放到下篇将做介绍。按位运算不可不懂,功能太好了。

  1。反射的技术实践
3。按位运算的项目实践,接上文的反射项目实践