DynamicObject擴展--實現JSON和DynamicObject的序列化與反序列化

来源:http://www.cnblogs.com/VAllen/archive/2017/04/05/DynamicObjectAndJsonToDeserializeAndSerialize.html
-Advertisement-
Play Games

度娘許久,找不到我滿意的答案,於是自己東湊西湊實現一個。 DynamicObject擴展--實現JSON和DynamicObject的序列化與反序列化,親測良好。 看代碼 ...


度娘許久,找不到我滿意的答案,於是自己東湊西湊實現一個。

DynamicObject擴展--實現JSON和DynamicObject的序列化與反序列化,親測良好。

 

看代碼

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Runtime.CompilerServices;
using Newtonsoft.Json;

namespace ConsoleApplication
{
    [Serializable]
    public class ExtensionDynamicObject : DynamicObject, IDictionary<string, object>, ICloneable, INotifyPropertyChanged
    {
        private readonly IDictionary<string, object> _values = new Dictionary<string, object>();

        #region IDictionary<String, Object> 介面實現

        public object this[string key]
        {
            get { return _values[key]; }

            set
            {
                _values[key] = value;


                OnPropertyChanged(key);
            }
        }

        public int Count
        {
            get { return _values.Count; }
        }

        public bool IsReadOnly
        {
            get { return _values.IsReadOnly; }
        }

        public ICollection<string> Keys
        {
            get { return _values.Keys; }
        }

        public ICollection<object> Values
        {
            get { return _values.Values; }
        }

        public void Add(KeyValuePair<string, object> item)
        {
            _values.Add(item);
        }

        public void Add(string key, object value)
        {
            _values.Add(key, value);
        }

        public void Clear()
        {
            _values.Clear();
        }

        public bool Contains(KeyValuePair<string, object> item)
        {
            return _values.Contains(item);
        }

        public bool ContainsKey(string key)
        {
            return _values.ContainsKey(key);
        }

        public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
        {
            _values.CopyTo(array, arrayIndex);
        }

        public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
        {
            return _values.GetEnumerator();
        }

        public bool Remove(KeyValuePair<string, object> item)
        {
            return _values.Remove(item);
        }

        public bool Remove(string key)
        {
            return _values.Remove(key);
        }

        public bool TryGetValue(string key, out object value)
        {
            return _values.TryGetValue(key, out value);
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return _values.GetEnumerator();
        }

        #endregion

        #region ICloneable 介面實現

        public object Clone()
        {
            var clone = new ExtensionDynamicObject() as IDictionary<string, object>;

            foreach (var key in _values.Keys)
            {
                clone[key] = _values[key] is ICloneable ? ((ICloneable)_values[key]).Clone() : _values[key];
            }

            return clone;
        }

        #endregion

        #region INotifyPropertyChanged 介面實現

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion

        /// <summary>  
        /// 獲取屬性值  
        /// </summary>  
        /// <param name="propertyName"></param>  
        /// <returns></returns>  
        public object GetPropertyValue(string propertyName)
        {
            if (_values.ContainsKey(propertyName) == true)
            {
                return _values[propertyName];
            }
            return null;
        }

        /// <summary>  
        /// 設置屬性值  
        /// </summary>  
        /// <param name="propertyName"></param>  
        /// <param name="value"></param>  
        public void SetPropertyValue(string propertyName, object value)
        {
            if (_values.ContainsKey(propertyName) == true)
            {
                _values[propertyName] = value;
            }
            else
            {
                _values.Add(propertyName, value);
            }
        }

        /// <summary>  
        /// 實現動態對象屬性成員訪問的方法,得到返回指定屬性的值  
        /// </summary>  
        /// <param name="binder"></param>  
        /// <param name="result"></param>  
        /// <returns></returns>  
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = GetPropertyValue(binder.Name);
            return result != null;
        }

        /// <summary>  
        /// 實現動態對象屬性值設置的方法。  
        /// </summary>  
        /// <param name="binder"></param>  
        /// <param name="value"></param>  
        /// <returns></returns>  
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            SetPropertyValue(binder.Name, value);
            return true;
        }

        ///// <summary>
        ///   http://blog.csdn.net/hawksoft/article/details/7534332
        ///// 動態對象動態方法調用時執行的實際代碼  
        ///// </summary>  
        ///// <param name="binder"></param>  
        ///// <param name="args"></param>  
        ///// <param name="result"></param>  
        ///// <returns></returns>  
        //public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        //{
        //    var theDelegateObj = GetPropertyValue(binder.Name) as DelegateObj;
        //    if (theDelegateObj == null || theDelegateObj.CallMethod == null)
        //    {
        //        result = null;
        //        return false;
        //    }
        //    result = theDelegateObj.CallMethod(this, args);
        //    return true;
        //}

        public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
        {
            return base.TryInvoke(binder, args, out result);
        }
    }

    public class ExcelModelDynamicObject : ExtensionDynamicObject
    {
        public string Name
        {
            get { return this["Name"].ToString(); }
            set { this["Name"] = value; }
        }
        public string Age
        {
            get { return this["Age"].ToString(); }
            set { this["Age"] = value; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            dynamic eo = new ExcelModelDynamicObject();
            eo.Age = 25;
            eo.Name = "Allen";
            eo["Title"] = "Test Dynamic Object";
            eo.Content = "Hi,Allen.";

            string jsonString = JsonConvert.SerializeObject(eo);
            //{"Age":25,"Name":"Allen","Title":"Test Dynamic Object","Content":"Hi,Allen."}

            dynamic eo2 = JsonConvert.DeserializeObject<ExcelModelDynamicObject>(jsonString);
            string value1 = eo2.Title;//Hello
            string value2 = eo2.Content;//Hi,Allen.

            ExcelModelDynamicObject eo3 = eo2;
            string value3 = eo3.Age;
            string value4 = eo3.Name;
            
            //very done.
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前寒假時,試著使用jQuery寫了幾個非同步請求demo, 但是那樣是使用的webform普通頁面,一般應該是用 webservice 居多。 最近寫後臺管理時,想用非同步來實現一些信息的展示和修改, 這是第一次真正的在實際中運用ajax,卡了一個小時才做好簡單的信息展示。 在這之間遇到了兩個問題。寫 ...
  • C# 泛型集合之非泛型集合類與泛型集合類的對應: ArrayList對應List HashTable對應Dictionary Queue對應Queue Stack對應Stack SortedList對應SortedList 第一 : ArrayList(非泛型集合) 與List(泛型集合) Arra ...
  • 內部類,就是在類的內部定義的類......內部類訪問特點1,內部類可以直接訪問外部類的成員,包括私有...2,外部類要訪問內部類的成員,必須創建對象...外部類名.內部類名 對象名=外部類對象.內部類對象; class Test { public static void main(String[] ...
  • 一、Jenins+GitHub "參考" 另外需要配置Global Tool Configuration 如果沒有安裝git,需下載安裝, "下載地址" 二、jenkins發佈donet core應用 1.配置MSBuild 1.1安裝Visual Studio 2017生成工具, "下載地址" 1 ...
  • 使用 StackExchange.Redis 封裝屬於自己的 RedisHelper 目錄 核心類 ConnectionMultiplexer 字元串(String) 哈希(Hash) 列表(List) 有序集合(sorted set) Key 操作 發佈訂閱 其他 簡介 目前 .NET 使用訪問 ...
  • 下拉列表 以性別為例 綁定可以了,可以顯示了,但有些地方就能傳值,有些地方就會出錯提示,如有大神請指教。。。。 錯誤如下: 具有鍵“sex”的 ViewData 項屬於類型“YTgoShopping.Utilities.sex”,但它必須屬於類型“IEnumerable<SelectListItem ...
  • 一、屌絲也有春天 "親愛的,在不?" "妹子,你電腦又感覺慢了麽?您以後裝軟體的時候註意點行不,能不能不要裝上7-8個瀏覽器,3-4個殺毒軟體,啥配置的機子你都感覺卡。以後別到處瞎找動作類電影看,網上一般都掛馬騙你們這些小白的,實在想看找我要種子不就行了。" "沒有啦,人家電腦好著呢,您不是做軟體的 ...
  • 如果大家研究一些開源項目,會發現無處不在的DI(Dependency Injection依賴註入)。 本篇文章將會詳細講述如何在MVC中使用Ninject實現DI 文章提綱 場景描述 & 問題引出 第一輪重構 引入Ninject 第二輪重構 總結 場景描述 & 問題引出 DI是一種實現組件解耦的設計 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...