技巧/诀窍:用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译)
【原文地址】 Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5
【原文发表日期】 Monday, October 01, 2007 10:33 PM
今年早些时候,我通过blog介绍了 C# 和 VB 语言的一项新的扩充特性"扩展方法"。
扩展方法让开发者可以向已有的 CLR 类型的公共契约中添加新的方法,而不需要子类化或重新编译原有的类型。通过这种做法,可以使很多有用的应用场景成为可能(包括 LINQ)。同时,扩展方法也可以用来非常方便地向代码中添加"语法糖"。
过去几个月,我一直在准备一些很酷的扩展方法的清单,并计划在有空的时候实现它们(不确定何时...但至少我还能从这些想法中获得乐趣)。在上述清单中有两个扩展方法的应用场景,分别是用于为任意 .NET 对象自动生成JSON (JavaScript Object Notation)或 XML 序列化字符串的。
简单场景:ToJSON() 扩展方法
假设我有一个 Person 类定义如下(注意:我使用了 自动属性的新特性来实现):
接下来,我就可以初始化一系列 Person 对象的集合,然后只需调用 ToJSON() 扩展方法,就能得到表示该集合内容的 JSON 字符串。如下所示:
这和 .NET 中内建的,Object 类的 ToString() 方法调用方式很相似 —— 只是生成的结果是表示集合内容的 JSON 格式的字符串而已。然后我们就可以在 AJAX 场景的客户端使用它:
注意:点击上图中调试器的放大镜图标,可以打开"文本视图(Text Visualizer)",能更方便的查看 JSON 序列化字符串:
接下来,这个字符串格式在客户端可以用 JavaScript 来实例化为合适的 JavaScript 对象,用于表示我的集合内容(注: ASP.NET AJAX 有一个内建的 JavaScript 库支持这些特性)。
实现 ToJSON 扩展方法
实现一个基本的 ToJSON() 扩展方法很简单。只要使用 System.Web.Script.Serialization 命名空间下的 JavaScriptSerializer 类即可,然后象下面所示的那样定义两个扩展方法。其中一个方法用于对目标对象图(object graph)进行"深"的序列化,而另一个方法则是一个重载的版本,它允许你指定序列化的深度(比如:ToJSON(2) 只序列化 2 个层次的深度)。
注意,上面的 ToJSON() 扩展方法只是针对 "Object" 类型而定义的——这意味着它可以被用于 .NET 中的任何类型(不限于集合)。也就是说,我们不仅能对上述集合调用 .ToJSON() 方法,还可以对单独的 Person 对象调用 ToJSON() 方法,或者任意其他的 .NET 类型都可以。
要使用上述扩展方法,只需在程序的顶部添加如下命名空间的引用即可:
然后 VS 2008 就可以为任意对象提供针对这些扩展方法的代码自动完成和编译时支持功能:
注意:除了 JavaScriptSerializer 类之外,.NET 3.5 还包含一个新的new System.Runtime.Serialization.DataContractJsonSerializer class 类 ,你也可以用它来做 JSON 序列化/反序列化的工作。
小结
希望以上的例子能给你一个使用扩展方法来封装功能的示例。下次希望我们一起来看一些好的工具库,用于提供类似有用的扩展方法的功能。
我非常想看到其他关于可复用的扩展方法使用场景的建议(请通过这篇帖子的评论来建议)。然后我们可以琢磨出,如何创建一个好的 CodePlex 项目,来把这些方法捆绑到一个库中以便利用。
希望这篇帖子对你有用,
Scott
注:请通过我的 技巧/诀窍 和教程页面 找到我写的更多有用的 ASP.NET 和 .NET 的帖子。
转载于:https://www.cnblogs.com/cisky/archive/2008/01/08/1030012.html
技巧/诀窍:用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译)相关推荐
- 用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译)
[原文地址] Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5 [原文发表日期] Monday, October 01, ...
- 用 .NET 3.5 创建 ToJSON() 扩展方法
今年早些时候,我通过blog介绍了 C# 和 VB 语言的一项新的扩充特性"扩展方法". 扩展方法让开发者可以向已有的 CLR 类型的公共契约中添加新的方法,而不需要子类化或重新编 ...
- (转)[翻译] ASP.NET MVC Tip #1 - 使用扩展方法创建新的HTML Helper
原文地址:http://weblogs.asp.net/stephenwalther/archive/2008/06/13/asp-net-mvc-tip-1-creating-new-html-he ...
- office技巧:Word如何快速的创建表格
Word如何创建表格 创建表格的方法有很多种,我们可以通过Word提供的插入表格功能创建表格,也可以手动绘制表格,甚至还可以将输入好的文字转换为表格,灵活掌握这些方法,便可创建自己需要的表格. 一, ...
- samba服务器新建文件权限,Ubuntu中安装samba服务器创建文件共享的方法及普通用户设置共享的问题解析...
Ubuntu中安装samba服务器创建文件共享的方法及普通用户设置共享的问题解析 发布时间:2011-01-04 19:10:00 作者:佚名 我要评论 本文是基于ubuntu桌面版进行操作说 ...
- php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...
本文实例讲述了Laravel5.1数据库连接.创建数据库.创建model及创建控制器的方法.分享给大家供大家参考,具体如下: 前言:laravel创建数据库,实际可以手动创建,如古老的phpmyadm ...
- python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】
本文实例讲述了Python创建对称矩阵的方法.分享给大家供大家参考,具体如下: 对称(实对称)矩阵也即: step 1:创建一个方阵 >>> import numpy as np & ...
- 创建Firefox扩展
创建Firefox扩展 [A] [A] 原文地址:https://developer.mozilla.org/en/Building_an_Extension 翻译:Karl Ma email: k ...
- PS实用小技巧:把png批量转换成jpg的方法
内容提要:本文的PS实用小技巧:把png批量转换成jpg的方法,不仅适用于png批量转换jpg,还适用于PSD等格式批量转换成jpg格式.对PS感兴趣的朋友可加 ps学习交流群:142574315 今 ...
最新文章
- python 报错 TypeError: type ‘types.GenericAlias‘ is not an acceptable base type
- Spark:获取dataframe某列最大值
- 刚发现的2011年最给力的春联
- 【渝粤教育】电大中专药事管理与法规作业 题库
- 【英语学习】【Level 07】U06 First Time L3 Subway everyday
- SQLAlchemy 嵌套事务的解决方案
- 让cp显示进度的脚本
- 引用父类成员的关键字是java_Java 中对父类成员访问用的关键字是 ,而引用当前对象的关键字是 。_学小易找答案...
- 微型计算机硬件认识和拆装,微型计算机系统硬件组成及外设认识.doc
- Glide修改本地图片缓存路径
- 面向对象第一单元(表达式求导)总结体会
- 如何实现:GridView 控件中显示的文本不自动换行,隐藏超出宽度部分wj-wangjun
- java —— int和byte的相互转化工具方法
- 计算机网络分组交换特点,分组交换技术在计算机网络技术中的作用及特点是什么?...
- 得链表者得天下(上)
- 苹果Mac电脑L2TP连接公司内部网络失败解决方案
- 宜信唐宁:个人投资者做好资产配置至关重要
- 最近公共祖先 (Lowest common ancestor)
- UVa679 Dropping Balls (满二叉树+开关灯思想)
- 5e平台能在linux,国服玩家正常使用5E对战平台的指引
热门文章
- pdfjs 字体新增_JS - PDF文件生成库jsPDF使用详解2(修改文字样式)
- mysql CONCAT和DATE_ADD函数的使用
- 一个完整简单而又强力的计算器程序--用python实现(Python3.7)
- 串口设备短信模块开发笔记
- js 12:00时间加上半小时,返回小时和分钟
- Linux /centos7源码编译安装Nginx
- 在excel中使用offset和match函数进行二维表对二维表的匹配
- 数据库---主键,候选键,超键
- 【管理学视频课程】关键链的本质--…
- 计算广告CTR预估系列(九)--NFM模型理论与实践