用 .NET 3.5 创建 ToJSON() 扩展方法
今年早些时候,我通过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 项目,来把这些方法捆绑到一个库中以便利用。
希望这篇帖子对你有用,
转载于:https://www.cnblogs.com/China-Dragon/archive/2010/05/10/1731682.html
用 .NET 3.5 创建 ToJSON() 扩展方法相关推荐
- 技巧/诀窍:用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译)
[原文地址] Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5 [原文发表日期] Monday, October 01, 2 ...
- 用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译)
[原文地址] Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5 [原文发表日期] Monday, October 01, ...
- (转)[翻译] 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 ...
- [译文]c#扩展方法(Extension Method In C#)
原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...
- C#笔记13 匿名类型、集合初始化器、扩展方法和查询表达式
文章目录 匿名类型 new{...}和隐式类型var 集合初始化器和对象初始化器 扩展方法 案例引出扩展方法的意义 扩展方法的使用 做Enumerable的扩展方法 扩展方法使用 标准查询运算符 Li ...
- 扩展springmvc组件——当页面跳转时,需要在Controller里面创建一个空方法去跳转或者是创建一个配置类 ||日期格式化说明||自定义格式化器||消息转化器扩展fastjson
在容器中注册视图控制器 当页面跳转时,我们需要在Controller里面创建一个空方法去跳转,那么有没有别的配置方法呢 创建一个WebMvcConfig的配置类 实现WebMvcConfigure ...
- 你真的了解扩展方法吗?
定义 微软对于扩展方法的定义是: 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种静态方法,但可以像扩展类型上的实例 ...
- 技术图文:C# 语言中的扩展方法
背景 前段时间,在知识星球立了一个Flag,在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点,于是先总结一下. 1.扩展方法概述 扩展方法能够向现有类型"添加" ...
- 使用扩展方法和静态门面类实现伪领域对象
背景介绍 领域对象,在此特指充血的领域对象模型,在解决什么是伪领域对象之前,需要事先解释何为充血的领域对象.在此后的介绍中,假设我们存在对象模型Employee-Department. 在面向对象的实 ...
最新文章
- Python Beautiful Soup类的基本元素
- 浏览器tab关闭事件_翻译|揭示现代浏览器原理(2):网页访问 — Chrome官方
- Mac OS 下安装 MacVim
- Spring Boot 与DBunit 配合使用
- C++类与const关键字
- ICML 2020 | Google提出最强生成式摘要预训练模型——天马
- VTK:重新采样附加的 PolyData用法实战
- Android基础总结(八)Service
- Nessus Plugins Download Fail
- Android笔记 Android客户端从服务器获取源码乱码demo
- HTC公布第二款区块链手机Exodus 1s:或将于9月前发售
- python求矩阵维度必须一致_python数据分析(二)--Numpy
- 转:KVC与KVO机制
- go语言 读文件最后一行_Go 语言核心文件调试
- Apache Project LIst 所有项目介绍
- wamp php 如何安装,WAMP的详细安装过程分享
- Recovering BST
- 02、RabbitMQ之交换机
- 天津市高中计算机会考,天津高中会考科目有哪些
- org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locke
热门文章
- java空心菱形_java 空心菱形
- npm install 报错 汇总_2020年特岗教师招聘征集志愿人员资格复审、面试公告汇总...
- react生命周期函数_如何优雅的消灭掉react生命周期函数
- 净迁移人口预测程序python_高质量深度学习模型, 一键模型预测,迁移学习很简单...
- mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别
- android-ViewPager不能显示
- Sublime Text提示Unable to download XXX. Please view the console for more details安装插件失败解决
- 【渝粤教育】 国家开放大学2020年春季 2773特种动物养殖 参考试题
- [渝粤教育] 中国地质大学 事故应急救援 复习题
- 【渝粤教育】广东开放大学 知识产权法 形成性考核 (34)