create table memberinfo ( member_id int, member_name varchar(20), member_birthday varchar(50) ) go
/// <summary> /// 微信消息中的参数 /// </summary> public class wechatouputpara { private String _name = ""; /// <summary> /// 会员姓名 /// </summary> public String name { get { return _name ; } set { _name = value; } } private String _birthday= ""; /// <summary> /// 会员生日 /// </summary> public String birthday { get { return _birthday; } set { _birthday= value; } } }
需要达到的最终效果:将数据库memberinfo表中的一条会员信息获取出来,并将姓名member_name赋值给wechatouputpara类的name属性,将生日member_birthday赋值给birthday属性。
既然有很多方法都需要用同一种方式处理,那么自然而然要想到有没有一种能够公用的方法,一劳永逸。毕竟每个表的结构是不同的,传回的数据可能多达十几二十 几个字段,如果每个方法中,都要将表中每个字段的值依次赋值给model中的对应属性,那么工作量和代码量都会非常大。
我的解决办法如下:
(1)通过SQL语句从表中获取数据时,将每个字段转换为与model中的对应属性相同的名称。
(2)写一个方法,能够将DataTable表中的每一个字段赋值给model中与其名称相同的属性。
(3)使用泛型,将这个方法作为一个公用方法,每个数据表向对应model中赋值时,都可以调用这个方法。
接下来,仍然使用上面列出的简单例子,来说明最终的解决方案。
(1)使用SQL语句获取数据:
select member_name as [name],member_birthday as birthday from memberinfo where member_id = 1
在代码中,获取到的数据被存到DataTable dtInfo中。
(2)写一个公用方法,实现:将DataTable表中的每一个字段赋值给model中与其名称相同的属性。
/// <summary> /// 将DataTable中的每一列赋值给model中的同名属性 /// DataTable中只有一行数据 /// </summary> /// <typeparam name="T">泛型:model的类型</typeparam> /// <param name="objmodel">model的实例</param> /// <param name="dtInfo">DataTable表</param> public void TableToModel<T>(T objmodel, DataTable dtInfo) { //获取model的类型 Type modelType = typeof(T); //获取model中的属性 PropertyInfo[] modelpropertys = modelType.GetProperties(); //遍历DataTable的每一列 for (Int32 i = 0; i < dtInfo.Columns.Count; i++) { //遍历model的每一个属性 foreach (PropertyInfo pi in modelpropertys) { String name = pi.Name; //获取属性名称 //若model属性名称与表中的列名相同 if (name == dtInfo.Columns[i].ColumnName) { //获取表中该列对应的数据 object value = dtInfo.Rows[0][i].ToString(); //将表中该列下的数据赋值给model中的同名属性 modelType.GetProperty(name).SetValue(objmodel, value, null); } } } }
(3)在代码中调用公用方法,将DataTable dtInfo中的数据赋值给wechatouputpara类。
//输出参数
wechatouputpara objwechatouputpara = new wechatouputpara();
//将会员信息赋值给输出参数
TableToModel<wechatouputpara>(objwechatouputpara, dtInfo);
问题解决了,13个类似的方法都可以直接一句话调用这个公用方法,就可以完成赋值操作,是不是简单多了呢?并且,如果数据表的结构发生变化,或者微信消息 需要添加、删除参数,只需要修改SQL语句和对应的model即可,不需要去修改对应的赋值语句,非常灵活。