c#設置對象屬性——反射實體設置變量


前台如果只傳遞了一兩個數據,在后台請求獲取數據設置屬性值還能夠接受,但是如果傳遞了大量的數據,就得多次HttpRequest reques[“XXX”]請求獲取數據設置屬性值,輸入的代碼量就很大,而且相當耗費時間,這種費時費力的方法是難以接受的。下面為大家提供一個取巧的方法,獲取請求數據就變的很簡單了,而且可以節省時間。話不多說,直接上代碼:

C#代碼如下:

 

/// <summary>
    /// 設置對象屬性——反射實體設置變量
    /// </summary>
    /// <param name="obj">對象</param>
  /// <param name="set">設置屬性操作</param>
    protected void Set_Property(object obj,Del_Property set) {
        string param = string.Empty,type;
        PropertyInfo[] propertys = obj.GetType().GetProperties();
        foreach (PropertyInfo p in propertys){
            //獲取請求參數
            object[] columns = p.GetCustomAttributes(typeof(JsonPropertyAttribute), true);
            if (columns.Length > 0){
                //設置屬性值
                param = request[(columns[0] as JsonPropertyAttribute).PropertyName];
                if (param != null){
                    type = p.PropertyType.ToString();
                    type = Regex.Match(type, type.IndexOf("[") > -1 ? @"(?<=\[\w+\.)[^\]]+" : @"(?<=\.)\w+").Value;
                    switch (type) {
                        case "Boolean": p.SetValue(obj, Boolean.Parse(param), null); break;
                        case "Byte": p.SetValue(obj, Byte.Parse(param), null); break;
                        case "Decimal": p.SetValue(obj, Decimal.Parse(param), null); break;
                        case "DateTime": p.SetValue(obj, DateTime.Parse(param), null); break;
                        case "Int16": p.SetValue(obj, Int16.Parse(param), null); break;
                        case "Int32": p.SetValue(obj, Int32.Parse(param), null); break;
                        case "Int64": p.SetValue(obj, Int64.Parse(param), null); break;
                        case "Single": p.SetValue(obj, Single.Parse(param), null); break;
                        case "Entity": ; break;
                        default: p.SetValue(obj, param, null); break;
                    }
                }
            }
        }
        if (set != null) set(obj);
    }

 

 


示例:

using System;
using System.Data;
using System.Collections.Generic;
using DataObject.Attrib;
using Newtonsoft.Json;

//部分實體
namespace TiaoCeng.Entity { /// <summary> /// 訂單 /// </summary> [DBTable(Name = "[Orders]",PrimaryKey="or_id")] public class OrdersModel : DataObject.DataFactory.DataModule<OrdersModel> { /// <summary> ///訂單構造函數 /// </summary> public OrdersModel() : base() { } /// <summary> ///訂單構造函數 /// </summary> /// <param name="constring">數據庫連接字符串</param> public OrdersModel(string constring) : base(constring) { } /// <summary> /// 訂單id /// </summary> [DBColumn(Name = "or_id", Size = 4, dbType = SqlDbType.Int, PrimaryKey = true)] [JsonProperty(PropertyName = "or_id")] public int? Or_id { get; set;} /// <summary> /// 購買者id,為0表示為非用戶id /// </summary> [DBColumn(Name = "m_id", Size = 4, dbType = SqlDbType.Int)] [JsonProperty(PropertyName = "member")] public MemberModel Member { get; set; } /// <summary> /// 購買者聯系電話 /// </summary> [DBColumn(Name = "or_buyerTel", Size = 50, dbType = SqlDbType.VarChar)] [JsonProperty(PropertyName = "or_buyertel")] public string Or_buyerTel { get; set;} /// <summary> /// 購買者地址 /// </summary> [DBColumn(Name = "or_buyerAddress", Size = 200, dbType = SqlDbType.NVarChar)] [JsonProperty(PropertyName = "or_buyeraddress")] public string Or_buyerAddress { get; set;}/// <summary> /// 已付款金額 /// </summary> [DBColumn(Name = "or_payPrice", Size = 9, dbType = SqlDbType.Decimal)] [JsonProperty(PropertyName = "or_payprice")] public decimal? Or_payPrice { get; set;}/// <summary> /// 訂單狀態(0購物車,1待核實, 2待付款,3付款成功,4已發貨,5確認收貨,6申請退款,7退款成功,8退款失敗) /// </summary> [DBColumn(Name = "or_progressState", Size = 4, dbType = SqlDbType.Int)] [JsonProperty(PropertyName = "or_progressstate")] public int? Or_progressState { get; set;} /// <summary> /// 訂單進度說明 /// </summary> [DBColumn(Name = "or_progress", Size = 1000, dbType = SqlDbType.NVarChar)] [JsonProperty(PropertyName = "or_progress")] public string Or_progress { get; set;}/// <summary> /// 狀態(0待審核,1審核通過,2審核失敗,3回收站,4.作廢) /// </summary> [DBColumn(Name = "or_state", Size = 1, dbType = SqlDbType.TinyInt)] [JsonProperty(PropertyName = "or_state")] public byte? Or_state { get; set; }

     .... }
 
         
//實體對象
OrdersModel _order = new OrdersModel();

//
設置訂單信息 Set_Property(_order, (obj) => {   _order.Member = new MemberModel() { M_id = m_id };   if (!string.IsNullOrEmpty(request["paydate"])) _order.Or_payDate = DateTime.Parse(request["paydate"] + " 00:00:00");   if (!string.IsNullOrEmpty(request["shipdate"])) _order.Or_shipDate = DateTime.Parse(request["shipdate"] + " 00:00:00");   _order.Or_price = _price;   _order.Or_amount = _num;   _order.Or_getIntegral = _getIntegral; });

 

這樣一來,不管前台傳遞多少數據,后台只需要將實體對象傳遞進去就可以省時省力的完成設置屬性值的操作,當然前台的請求參數要與實體的拓展屬性名保持一致。是不是很方便,快來試一試吧。有什么好的方法或者建議可以聯系我,我們一起探討。

 

 

新浪微博(求關注)地址:

http://weibo.com/zhengdjin

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM