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

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. ImageSpan图片不能居中的问题

    点击下载:MyImageSpan.txt 使用ImageSpan的童鞋应该都会遇到这样一个困惑,图片不能居中显示,ImageSpan中只有ImageSpan.ALIGN_BASELINE与ImageS ...

  2. dev控件chart简单实现多图例,双曲线,双柱图,曲线与柱图

    1.效果图 2.数据源代码: ; i < ; i++) { == ) { dt1.Rows.Add( * i); dt2.Rows.Add( * i+); } else { dt1.Rows.A ...

  3. ionic接入广告

    一.获取Admob phonegap 广告插件(cordova 广告平台插件) 在cordova 和phonegap等html5手机应用里面展示Admob,百度移动联盟,广点通广告需要Cordova ...

  4. 一次测试测试(C++11)智能指针引用的崩溃结论

    项目中用到了智能指针,但是要在智能指针指向的类中获取此类的shared_ptr指针传给其引用的类,结果出现了问题, 测试代码如下: (包括错误解释) //测试 shared_ptr weak_ptr ...

  5. 1.5编程基础之循环控制44:第n小的质数

    #include<iostream>#include<cmath>using namespace std;int main(){ int n; cin>>n; in ...

  6. MJRefresh在UITableView中的使用

    前言 MJRefresh是一个好用的上下拉刷新的控件,github地址如下:https://github.com/CoderMJLee/MJRefresh 很多app都使用这个控件,我们也来了解一下它 ...

  7. ASP.NET MVC 使用Uploadify实现多文件异步无刷新上传

    软件技术开发,合作请联系QQ:858-048-581 这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解 ...

  8. 每天一个Linux命令(11)--nl命令

    nl命令在Linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号,其默认的结果与cat -n 有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动不起0等等的功能. ...

  9. 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap

    1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Sw ...

  10. c#基础语句——分支语句

    一.if...else... if是如果的意思,else是另外的意思,if后面跟(),括号内为判断条件,如果符合条件则进入if语句执行命令.如果不符合则不进入if语句.else后不用加条件,但是必须与 ...