度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个。

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 = ;
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.
}
}
}

DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化的更多相关文章

  1. json相关注解和序列化与反序列化

    使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...

  2. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  3. ASP.NET中JSON对时间进行序列化和反序列化

    JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...

  4. C++ 基于rapidjson对json字符串的进行序列化与反序列化

    json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是 ...

  5. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  6. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  7. 【转】Newtonsoft.Json 的序列化与反序列化

    http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...

  8. Json.Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  9. Json.Net系列教程 3.Json.Net序列化和反序列化设置

    原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...

随机推荐

  1. Codeforces Round #372 +#373 部分题解

    用了两场比赛上Div 1感觉自己好腊鸡的说...以下是这两场比赛的部分题解(不得不说有个黄学长来抱大腿还是非常爽的) Round #372 : Div 2 A:Crazy Computer 题意:给定 ...

  2. 【openstack N版】——计算服务nova

    一.openstack计算服务nova 1.1nova介绍 Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这 ...

  3. 重回博客 谈一谈Node中的异步和单线程

    重回博客,这个帐号之前注册后就只发了一篇博客.听朋友建议,决定一周两次更新. 第一篇谈论一下最近想的比较多的异步的问题. 传统多线程异步 传统的异步是多线程的,当要同时做两件事的时候,他们是执行在不同 ...

  4. hdoj1242(dfs 剪枝 解法)

    题意:拯救行动,天使r有多个朋友a(friends,在这里被坑了几次,没看清题意),天使被关在牢房里,等着朋友来拯救,求拯救天使的最短距离. 解法:如果不剪枝,200*200的地图会超时,可以以天使为 ...

  5. win8和ubuntu双系统

    硬盘安装的话只要分够内存和做好开机启动项就好了,u盘安装要注意分区(挂载)了推荐: http://wenku.baidu.com/view/5052f19b51e79b8968022623.html ...

  6. KVC与KVO理解

    转载:https://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 理解 KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

  7. setDefaultCloseOperation()参数得使用说明

    System.exit(0)是退出整个程序,如果有多个窗口,全部都销毁退出.setDefaultCloseOperation()是设置用户在此窗体上发起 "close" 时默认执行 ...

  8. appledoc导出iOS代码文档的使用和问题详解(干货篇)

    appledoc导出iOS代码文档的使用和问题详解(干货篇) 1. 简单说一下背景和自己感受 背景: 项目好像突然黄了,公司让详细写项目代码的注释并且导出文档,弄完之后就要封版. 说实话:听到这个消息 ...

  9. Python中三种基本结构的语句

    选择语句 if 条件判断 : # 条件可以加括号也可以不加括号 -- else: -- Python中没有switch语句这是可以使用if exp:.... elif exp:来代替 if 判断条件1 ...

  10. MySQL入门(上)

    1 课程回顾 自定义标签&编码实战 1)自定义标签步骤: 1.1 编写标签处理器类,继承SimpleTagSupport类,覆盖doTag方法 1.2 在WEB-INF目录下建立tld文件,在 ...