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 = ;
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的序列化与反序列化的更多相关文章
- json相关注解和序列化与反序列化
使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...
- JSON与对象的序列化与反序列化
一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...
- ASP.NET中JSON对时间进行序列化和反序列化
JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...
- C++ 基于rapidjson对json字符串的进行序列化与反序列化
json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- Newtonsoft.Json 的序列化与反序列化
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- 【转】Newtonsoft.Json 的序列化与反序列化
http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...
- Json.Net序列化和反序列化设置
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- Json.Net系列教程 3.Json.Net序列化和反序列化设置
原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...
随机推荐
- JS特效——文字打印机
关键源码如下: 代码一 <!doctype html> <html lang="en"> <head> <meta charset=&qu ...
- Java Web(九) 用户管理系统
前面学习了一大堆,什么JSP,Servlet.jstl.el等等等,大多是一些死的东西,只要会其语法,知道怎么用就行了,所以做了一个小小的只有增删改查的小demo,为的就是熟悉这些知识.灵活运用起来. ...
- 每天一个linux命令(48)--ln命令
ln是Linux中又一个非常重要的命令,它的功能是为某个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每个需要的目录下都放一个相同的文件,我们只要在某个固 ...
- Javascript学习十
认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...
- 2017.3.3自测j纠错题.
解析: 在jUery中,他的背景颜色依次是红色,绿色,蓝色. 改变的是整个主体部分.<dody></body>. 单击. 2. 解析: 操作元素: html() 获取第 ...
- 依赖ConstraintLayout报错,Could not find *****,Failed to resolve:*****
ConstraintLayout 约束布局,AndroidStudio2.2中新增功能之一,可以先去看看这篇文章 Android新特性介绍,ConstraintLayout完全解析,2.3版本的And ...
- grpc-gateway:grpc对外提供http服务的解决方案
我所在公司的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,就希望可以做成用rpc来做内部的通讯,对外依然用Restful.于是就想到了google的grpc. 使用grpc ...
- 每天一个Linux命令 6
rpm包管理--yum在线管理 ip地址配置和网络yum源ip地址配置 #setup 使用setup工具 #vi /etc/sysconfig/network-scripts/ifcfg-eth0把O ...
- 2292: 【POJ Challenge 】永远挑战
2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 553 Solved: 230[Submit][ ...
- php基础语法(20161021)
上午: 数据库总结: 1.创建数据库 create database 数据库名称 删除数据库 drop database 数据库名称 2.创建表 create table 表名 ( 列名 类型(长度) ...