亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#動態類型,及動態對象的創建,合并2個對象,map實例

2019-10-29 21:13:31
字體:
來源:轉載
供稿:網友

經常會遇到這樣的情況,我們在響應客戶端請求的數據的時候需要對數據進行處理,比如數據庫中的數據是int型,它可能表示某個枚舉,或者其它的邏輯意義(數據庫這樣的設計可能是從數據安全性、存儲量上等角度考慮),但是客戶端顯示的時候需要是它具體的意義。

這個時候我們的處理方式一般都是2中的,如果邏輯不復雜,且單一的話,直接修改sql語句就能處理好數據源,這個時候代碼里面不需要處理什么。

但是如果邏輯復稍許復雜或者判斷的情況有很多分支,我們不得不從代碼角度來處理了。單個對象還好,多個對象比如是個list<T>,那就要循環對某個對象的字段進行XXX了。

進而衍生出了這就出現了DTO,Arg的中間對象,當然,我個人是很喜歡這樣的設計的,但是某些時候也會偷懶不想寫(多半情況我直接寫代碼生器批量生產),比如在測試的時候,在接私活的時候,在演示的時候,只為快速呈現想要的效果 都懶得去屑,是的,你會說市面上不是有很多的map庫,比如automap,tinymap,甚至json.net里面的動態特性重寫,方法當然很多,但用一個大輪子來費力搞這么個小事,我覺得劃不來。且輪子越來越大它要干的事越多,我可不想搞的那么復雜,嗯,就是這樣,寫了個。

具體的代碼貼到下面,如果看明白,會很方便的擴展了或修改成自己想要的效果。

using System.Dynamic;using System.Reflection;using System.Collections.Concurrent;private static readonly ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>  DynamicObjectProperties = new ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>();private IDictionary<string, Object> ToDynamicResult<T>(T classobj, Func<string, object, object> injectAct)  where T : IInjectClass, new(){  var type = typeof(T);  var key = type.TypeHandle;  var dynamicResult = new ExpandoObject() as IDictionary<string, Object>;  PropertyInfo[] queryPts = null;  DynamicObjectProperties.TryGetValue(key, out queryPts);  if (queryPts == null)  {    queryPts = type.GetProperties();    DynamicObjectProperties.TryAdd(key, queryPts);  }  foreach (var p in queryPts)  {    var attributes = p.GetCustomAttributes(typeof(IngorePropertyAttribute), true);    var columnMapping = attributes.FirstOrDefault();    if (columnMapping != null) continue;    var _name = p.Name;    var _value = p.GetValue(classobj, null);    object _tempvalue = _value;    if (injectAct != null) _tempvalue = injectAct.Invoke(_name, _value);    //var value = Convert.ChangeType(value,typeof(string));     dynamicResult.Add(p.Name, _tempvalue);  }  return dynamicResult;}/// <summary>/// 支持動態輸出的對象接口/// </summary>public interface IInjectClass{}/// <summary>/// 動態輸出時忽略此標記的屬性/// </summary>public class IngorePropertyAttribute : Attribute{}

下面我們測試一個:

 public class kk : IInjectClass {  public string aa { get; set; }  public int bb { get; set; }  [IngoreProperty]  public bool cc { get; set; }  public DateTime dd { get; set; } }kk ist = new kk();ist.aa = "aaa";ist.bb = 123;ist.cc = false;ist.dd = DateTime.Now;var tt = ToDynamicResult<kk>(ist, (k, v) =>{  if (k != "aa") return v;  return v + "(改變了哦)";});var json = Tools.JsonUtils.JsonSerializer(tt);json = json + "<br /><br />" + Tools.JsonUtils.JsonSerializer(ToDynamicResult<kk>(    new kk    {      aa = "test",      bb = 789,      cc = true,      dd = DateTime.Now.AddDays(2)    }, null));Response.Write(json);

您可以重新構造帶參數的特性或者修改injectAct對象,改成適合自己的

下面寫個測試,改成表達式樹最好了,先上個碼

using System;using System.Linq;using System.Dynamic;using System.Reflection;using System.Linq.Expressions;using System.Collections.Generic;using System.Collections.Concurrent;namespace Tools{  public class Class2Map  {    private static readonly ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>      DynamicObjectProperties = new ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>();    private static PropertyInfo[] GetObjectProperties<T>()    {      var type = typeof(T);      var key = type.TypeHandle;      PropertyInfo[] queryPts = null;      DynamicObjectProperties.TryGetValue(key, out queryPts);      if (queryPts == null)      {        queryPts = type.GetProperties();        DynamicObjectProperties.TryAdd(key, queryPts);      }      return queryPts;    }    /// <summary>    /// 單個對象映射    /// </summary>    /// <typeparam name="T">類型</typeparam>    /// <param name="source">實例</param>    /// <param name="injectAct">map方法集</param>    /// <returns>映射后的動態對象</returns>    public static IDictionary<string, Object> DynamicResult<T>(T source, params MapCondition[] injectAct)//where T : ICustomMap    {      var queryPts = GetObjectProperties<T>();      var dynamicResult = new ExpandoObject() as IDictionary<string, Object>;      foreach (var p in queryPts)      {        var attributes = p.GetCustomAttributes(typeof(IngoreProperty), true);        if (attributes.FirstOrDefault() != null) continue;        var _name = p.Name;           //原來是屬性名        var _value = p.GetValue(source, null); //原來的屬性值        object _resultvalue = _value;      //最終的映射值        if (injectAct != null)        {          string _tempname = null;          var condition = injectAct.FirstOrDefault(x => x.Orginal == _name);          if (CheckChangeInfo(condition, out _tempname))          {            _resultvalue = condition.fn.Invoke(_value);            dynamicResult.Add(_tempname ?? _name, _resultvalue);            continue;          }        }        //var value = Convert.ChangeType(value,typeof(string));         dynamicResult.Add(_name, _resultvalue);      }      return dynamicResult;    }    /// <summary>    /// 合并2個對象    /// </summary>    /// <typeparam name="TSource">對象1類型</typeparam>    /// <typeparam name="TTarget">對象2類型</typeparam>    /// <param name="s">對象1實例</param>    /// <param name="t">對象2實例</param>    /// <returns>合并后的動態對象</returns>    public static IDictionary<string, Object> MergerObject<TSource, TTarget>(TSource s, TTarget t)    {      var targetPts = GetObjectProperties<TSource>();      PropertyInfo[] mergerPts = null;      var _type = t.GetType();      mergerPts = _type.Name.Contains("<>") ? _type.GetProperties() : GetObjectProperties<TTarget>();      var dynamicResult = new ExpandoObject() as IDictionary<string, Object>;      foreach (var p in targetPts)      {        var attributes = p.GetCustomAttributes(typeof(IngoreProperty), true);        if (attributes.FirstOrDefault() != null) continue;        dynamicResult.Add(p.Name, p.GetValue(s, null));      }      foreach (var p in mergerPts)      {        var attributes = p.GetCustomAttributes(typeof(IngoreProperty), true);        if (attributes.FirstOrDefault() != null) continue;        dynamicResult.Add(p.Name, p.GetValue(t, null));      }      return dynamicResult;    }    /// <summary>    /// 合并2個對象    /// </summary>    /// <typeparam name="TSource">對象1類型</typeparam>    /// <typeparam name="TTarget">對象2類型</typeparam>    /// <param name="s">對象1實例</param>    /// <param name="t">對象2實例</param>    /// <returns>合并后的動態對象</returns>    public static List<IDictionary<string, Object>> MergerListObject<TSource, TTarget>(List<TSource> s, TTarget t)    {      var targetPts = GetObjectProperties<TSource>();      PropertyInfo[] mergerPts = null;      var _type = t.GetType();      mergerPts = _type.Name.Contains("<>") ? _type.GetProperties() : GetObjectProperties<TTarget>();      var result = new List<IDictionary<string, Object>>();      s.ForEach(x =>      {        var dynamicResult = new ExpandoObject() as IDictionary<string, Object>;        foreach (var p in targetPts)        {          var attributes = p.GetCustomAttributes(typeof(IngoreProperty), true);          if (attributes.FirstOrDefault() != null) continue;          dynamicResult.Add(p.Name, p.GetValue(x, null));        }        foreach (var p in mergerPts)        {          var attributes = p.GetCustomAttributes(typeof(IngoreProperty), true);          if (attributes.FirstOrDefault() != null) continue;          dynamicResult.Add(p.Name, p.GetValue(t, null));        }        result.Add(dynamicResult);      });      return result;    }    private static bool CheckChangeInfo(MapCondition condition, out string name)    {      name = null;      bool result = condition != null &&             condition.fn != null &&             !string.IsNullOrWhiteSpace(condition.Orginal);//&&            //!string.IsNullOrWhiteSpace(condition.NewName);      if (result)      {        var temp = condition.NewName;        name = (string.IsNullOrWhiteSpace(temp) || temp.Trim().Length == 0) ? null : temp;      }      return result;    }  }}

測試一下:

List<KeyValue> kk = new List<KeyValue> {   new KeyValue{key="aaa", value="111"},  new KeyValue{key="bbb", value="222"},  new KeyValue{key="ccc", value="333"},  new KeyValue{key="ddd", value="444"},};var result = Class2Map.MergerListObject<KeyValue, dynamic>(kk, new { p = "jon test" });var json = JsonUtils.JsonSerializer(result);Response.Write(json);

輸出如下:

[{"key":"aaa","value":"111","p":"jon test"},{"key":"bbb","value":"222","p":"jon test"},{"key":"ccc","value":"333","p":"jon test"},{"key":"ddd","value":"444","p":"jon test"}]var result = Class2Map.MergerObject<KeyValue, dynamic>(        new KeyValue { key = "aaa", value = "111" },        new { p = "jon test" }      );var json = JsonUtils.JsonSerializer(result);Response.Write(json);

輸出如下:

{ "key": "aaa", "value": "111", "p": "jon test" }

以上這篇c#動態類型,及動態對象的創建,合并2個對象,map實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人午夜一级二级三级| 国产精品1区2区在线观看| 人体精品一二三区| 欧美性极品xxxx娇小| 亚洲精品小视频在线观看| 国产精品日韩在线观看| 日韩的一区二区| 日韩欧美中文免费| 亚洲a在线播放| 国产美女精品视频| 亚洲综合日韩在线| 国产69精品久久久久99| 成人黄色短视频在线观看| 精品magnet| 日韩av在线一区| 亚洲国产小视频| 欧美激情国产日韩精品一区18| 欧美性受xxxx黑人猛交| 欧美xxxx综合视频| 成人激情视频在线观看| 国产精品国内视频| 欧美日韩国产页| 久久久久99精品久久久久| 日韩激情视频在线| 日韩成人久久久| 欧美性xxxxx极品娇小| 国产在线精品一区免费香蕉| 欧美日韩午夜剧场| 日韩电影免费观看中文字幕| 久久天堂av综合合色| 欧美一区二区色| 色yeye香蕉凹凸一区二区av| 国产精品av电影| 亚洲成年人在线播放| 国产精品久久久久久久久久三级| 欧美大奶子在线| 欧美成人合集magnet| 国产区精品在线观看| 欧美极品欧美精品欧美视频| 亚洲国产精品久久久久秋霞蜜臀| 久久全球大尺度高清视频| 久久精品国产2020观看福利| 日韩av免费一区| 欧美性猛交xxxx免费看漫画| 在线精品91av| 久热精品视频在线观看一区| 成人欧美一区二区三区黑人孕妇| 97香蕉久久超级碰碰高清版| xvideos亚洲| 国产精品日韩av| 欧美成人剧情片在线观看| 亚洲深夜福利网站| 日韩成人黄色av| 久久国产精品影片| 亚洲毛片在线观看| 国产精品高清免费在线观看| 亚洲精品v天堂中文字幕| 国产精品成人免费电影| 亚洲欧美日韩在线高清直播| 国产精品成人播放| 欧美色道久久88综合亚洲精品| 国产成人福利夜色影视| 国产精品一区二区性色av| 国产午夜精品美女视频明星a级| 亚洲精品在线不卡| 91久久国产综合久久91精品网站| 精品久久久91| 欧美一区二区影院| 久久成人亚洲精品| 国产精品久久久av久久久| 中文字幕国产亚洲2019| 久久久精品国产| 欧美一区二区三区……| 91精品免费久久久久久久久| 91精品久久久久久久久久久久久| 国产精品久久99久久| 91精品国产91久久久久福利| 亚洲精品日韩丝袜精品| 国产91亚洲精品| 亚洲欧美日韩爽爽影院| 91免费国产视频| 日韩极品精品视频免费观看| 国产一区在线播放| 98精品在线视频| 欧美天堂在线观看| 国产视频在线一区二区| 欧美大片免费观看在线观看网站推荐| 精品久久香蕉国产线看观看亚洲| 精品国产福利在线| 2020久久国产精品| 国产91免费观看| 欧美一级黑人aaaaaaa做受| 欧美超级免费视 在线| 亚洲一区二区三区在线视频| 欧美精品在线极品| 91麻豆桃色免费看| 久久中文字幕国产| 日本免费一区二区三区视频观看| 亚洲电影免费观看高清完整版| 国产精品久久久久aaaa九色| 欧美有码在线视频| 国产一区二区三区三区在线观看| 亚洲精品国产综合久久| 粉嫩老牛aⅴ一区二区三区| 91网站在线看| 久久免费福利视频| 91成人在线观看国产| 亚洲最大福利视频网| 日韩美女激情视频| 久热精品视频在线免费观看| 国产视频欧美视频| 国产一级揄自揄精品视频| 欧美精品在线播放| 国产精品高潮呻吟久久av黑人| 日韩精品视频在线| 亚洲欧美日韩国产中文| 国产精品日韩在线观看| 97国产精品视频人人做人人爱| 色综合91久久精品中文字幕| 欧美中文字幕第一页| 亚洲精品福利免费在线观看| 一区二区三区四区在线观看视频| 88xx成人精品| 色中色综合影院手机版在线观看| 国产偷国产偷亚洲清高网站| 性欧美xxxx| 国产精品高潮呻吟久久av黑人| 欧洲日本亚洲国产区| 国产亚洲欧美日韩一区二区| 亚洲一区二区三区毛片| 超碰97人人做人人爱少妇| 高清欧美一区二区三区| 国产精品视频地址| 亚洲直播在线一区| 福利精品视频在线| 精品国模在线视频| 日韩av资源在线播放| 视频一区视频二区国产精品| 在线不卡国产精品| 97成人精品区在线播放| 欧美日韩福利电影| 国产成人一区二区三区| 日韩在线观看精品| 成人免费网站在线看| 日韩av网址在线| 国产综合在线视频| 亚洲精品suv精品一区二区| 亚洲第一免费播放区| 美女福利精品视频| 亚洲欧美制服另类日韩| 亚洲韩国青草视频| 国产精品久久久久国产a级| 福利视频导航一区| 国产日韩在线亚洲字幕中文| 一区二区三区 在线观看视| 人人做人人澡人人爽欧美| 久久精品免费播放| 亚洲人成网站777色婷婷| 欧美黑人一区二区三区| 精品久久久久久国产| 国产精品美女无圣光视频| 成人欧美一区二区三区黑人| 国产综合香蕉五月婷在线| 中文字幕在线看视频国产欧美|