Работая над своим мелким проектом на Silverlight 4, пришла в голову мысль скрестить Extension Methods и Generics.
Получилось замечательно.
Ведь на самом деле, зачем писать метод расширения для конкретного объекта если можно это сделать для Generic классов. В этом случае мы получаем расширенные методы для всего множества имеющихся классов.
JsonExtension.cs
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
namespace JsonGenericExtExample
{
public static class JsonExtension
{
/// <summary>
/// Сериализовать объект в Json строку
/// </summary>
/// <param name="data">Объект</param>
/// <returns>строка содержащая сериализованный обеъкт в формате Json</returns>
public static string GetJson<T>(this T data) where T : class
{
string result;
using (var stream = new MemoryStream())
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(stream, data);
var reader = new StreamReader(stream);
stream.Position = 0;
result = reader.ReadToEnd();
}
return result;
}
/// <summary>
/// Десериализация объекта из Json строки
/// </summary>
/// <typeparam name="T">Тип результирующего объекта</typeparam>
/// <param name="data">Json строка</param>
/// <returns>Десериализованный объект</returns>
public static T Get<T>(this string data) where T : class
{
var deserializer = new DataContractJsonSerializer(typeof(T));
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
stream.Position = 0;
return deserializer.ReadObject(stream) as T;
}
}
}
}
Для использования достаточно вызвать созданный ранее метод.
// создаем тестовый экземпляр типом User
var CurrentUser = new User
{
FirstName = "Карим",
LastName = "Офигенов",
Age = 124
};
// вызываем extension метод у экземпляра для сериализации в JSON
string jsonString = CurrentUser.GetJson();
// Десериализуем
var DeserializedUser = jsonString.Replace("Карим","Макар").Get<User>();
Использование этих методов очень простое, мало того они теперь будут у всех типов объектов в проекте.
Скриншот тестового приложения

Исходники проекта
