.NET 3.5 引入的擴充方法,讓開發者無需繼承、無需重新編譯,即可為任何 CLR 型別「貼上」新方法。這不僅是 LINQ 的基石,更是打造領域專用語法糖的利器。本文示範如何為 object 型別新增 ToJSON(),實現一鍵序列化。
// 定義實體
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime BirthDate { get; set; }
}
// 使用擴充方法
var people = new List<Person>
{
new Person { Name = "張三", Age = 25, BirthDate = new DateTime(1998, 5, 1) },
new Person { Name = "李四", Age = 30, BirthDate = new DateTime(1993, 8, 15) }
};
string json = people.ToJSON();
// 結果:[{"Name":"張三","Age":25,"BirthDate":"1998-05-01T00:00:00"},...]
// 單一物件也適用
var person = new Person { Name = "王五", Age = 28 };
string singleJson = person.ToJSON();
// 結果:{"Name":"王五","Age":28,"BirthDate":"1995-01-01T00:00:00"}
using System;
using System.Web.Script.Serialization;
public static class JsonExtensions
{
///
/// 深度序列化為 JSON 字串
///
public static string ToJSON(this object obj)
{
if (obj == null) return "null";
var serializer = new JavaScriptSerializer();
return serializer.Serialize(obj);
}
///
/// 可控制序列化深度的多載版本
///
public static string ToJSON(this object obj, int recursionLimit)
{
if (obj == null) return "null";
var serializer = new JavaScriptSerializer { RecursionLimit = recursionLimit };
return serializer.Serialize(obj);
}
}
using YourNamespace.JsonExtensions; // 引用擴充方法所在命名空間
// VS2008 即可提供智慧提示
var json = myObject.ToJSON();
.NET 3.5 同時提供 System.Runtime.Serialization.Json.DataContractJsonSerializer,特點:
[DataContract]/[DataMember],控制更精確JavaScriptSerializerOnSerializing 等)JavaScriptSerializer 輸出 "/Date(1234567890123)/" 格式,前端需配合解析。若需 ISO 8601 格式,可自訂 JavaScriptConverter 或改用 JSON.NET(Newtonsoft.Json)。
預設 RecursionLimit = 100,複雜物件圖可能觸發例外。使用 ToJSON(50) 降低限制或實作自訂轉換器排除循環屬性。
public static string ToXML(this object obj)
{
if (obj == null) return string.Empty;
var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
using (var writer = new System.IO.StringWriter())
{
serializer.Serialize(writer, obj);
return writer.ToString();
}
}
透過擴充方法封裝 JavaScriptSerializer,我們為所有 .NET 型別賦予了 ToJSON()/ToXML() 能力,極大提升 AJAX、Web API、日誌記錄等場景的開發效率。這正是「語法糖」的價值:用最直觀的方式表達業務意圖,隱藏底層繁瑣細節。