一般处理程序的救星!利用反射一招叫你摆脱丑比代码

我们一般做异步请求数据的时候,都是通过post或者get提交数据。
我们后台接收post或者get数据的方式一般是这样的。。。

            int companyId = int.Parse(context.Request.Form["CompanyId"]); //公司ID
            int goodsTypeId = int.Parse(context.Request.Form["GoodsType"]); //产品类别
            string goodsName = context.Request.Form["GoodsName"]; //产品名称
            decimal nowPrice = decimal.Parse(context.Request.Form["NowPrice"]); //现价
            decimal costPrice = decimal.Parse(context.Request.Form["CostPrice"]);//成本价
            int goodsSubType = int.Parse(context.Request.Form["GoodsSubType"]); //是否是相册类产品
            decimal albumPagePrice = decimal.Parse(context.Request.Form["AlbumPagePrice"]); //每P单价
            int defaultPageNumber = int.Parse(context.Request.Form["DefaultPageNumber"]);//默认P数
            int goodsSort = int.Parse(context.Request.Form["GoodsSort"]);//排序
            string remark = context.Request.Form["Remark"]; //备注
            string branchIds = context.Request.Form["BranchIds"];//分店信息

一般我们拿到post过来的数据,然后赋值给实体。具体代码一般是这样。。

            int companyId = int.Parse(context.Request.Form["CompanyId"]); //公司ID
            int goodsTypeId = int.Parse(context.Request.Form["GoodsType"]); //产品类别
            string goodsName = context.Request.Form["GoodsName"]; //产品名称
            decimal nowPrice = decimal.Parse(context.Request.Form["NowPrice"]); //现价
            decimal costPrice = decimal.Parse(context.Request.Form["CostPrice"]);//成本价
            int goodsSubType = int.Parse(context.Request.Form["GoodsSubType"]); //是否是相册类产品
            decimal albumPagePrice = decimal.Parse(context.Request.Form["AlbumPagePrice"]); //每P单价
            int defaultPageNumber = int.Parse(context.Request.Form["DefaultPageNumber"]);//默认P数
            int goodsSort = int.Parse(context.Request.Form["GoodsSort"]);//排序
            string remark = context.Request.Form["Remark"]; //备注
            string branchIds = context.Request.Form["BranchIds"];//分店信息


            Models.Goods.GoodsInfo model = new Models.Goods.GoodsInfo();

            model.GoodsTypeId = goodsTypeId;
            model.GoodsName = goodsName;
            model.NowPrice = nowPrice;
            model.CostPrice = costPrice;
            model.GoodsSubType = goodsSubType;
            model.AlbumPagePrice = albumPagePrice;
            model.DefaultPageNumber = defaultPageNumber;
            model.GoodsSort = goodsSort;
            model.GoodDescription = remark;
            model.BranchIds = branchIds;
            model.CompanyId = companyId;

如果post过来30个参数,就要拼30遍,你们说这代码 # 丑比不丑比!!!!
来,我用一招拯救你。
我上面的代码,可以用两句代码来表示。


            Models.Goods.GoodsInfo model = new Models.Goods.GoodsInfo();
            model = KLY.Common.RequestDataHelper<Models.Goods.GoodsInfo>.PostDataToModel(context, model);

具体就是RequestDataHelper 这个帮助类。
通过反射把post过来的数据,直接转换成实体。
RequestDataHelper帮助类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace KLY.Common
{
    public class RequestDataHelper<T>
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static T PostDataToModel(HttpContext context,T model)
        {
            Type t = model.GetType();
            PropertyInfo[] pis = t.GetProperties();
            foreach (PropertyInfo pi in pis)
            {
                if (!string.IsNullOrEmpty(context.Request.Form[pi.Name]))
                {
                    Type type = pi.PropertyType;
                    Type underlyingType = Nullable.GetUnderlyingType(type);
                    pi.SetValue(model, Convert.ChangeType(context.Request.Form[pi.Name],underlyingType??type));
                }
            }
            return model;
        }
    }
}

不过我这种有局限性,只适用于实体的属性和post的参数名字一致的情况。(像我这种人,一般都是代码生成器生成,所以一般都是一致的。。。)

修改记录

2016.04.18 当实体有null的情况,转换成实体失败问题修改。
参考文献。
http://www.cnblogs.com/patrickyu/p/3211115.html
修改记录:

                    Type type = pi.PropertyType;
                    Type underlyingType = Nullable.GetUnderlyingType(type);
                    pi.SetValue(model, Convert.ChangeType(context.Request.Form[pi.Name],underlyingType??type));

文章如果对你有帮助,来点个赞~
如果有意见,来吐个槽也行!_

posted @ 2016-04-15 22:43  keepnode  阅读(729)  评论(7编辑  收藏  举报