Métodos de extensión en .Net
Los métodos de extensión permiten a los desarrolladores añadir métodos a los contratos públicos de tipos del CLR existentes, sin tener que crear subclases o recompilar el tipo original. Con esto se nos presentan un montón de nuevos escenarios (incluso en LINQ). También nos dan una forma muy conveniente de añadir un poco de azúcar sintáctico a nuestro código.Dos de los escenarios que añadí a mi lista de métodos de extensión eran métodos que generasen automáticamente JSON (JavaScript Object Notation) o cadenas de serialización XML para cualquier objeto .NET
Escenario Simple: El método de extensión ToJSON()
Supongamos que tenemos un objeto Person definido de la siguiente forma (nota: Usamos la nueva característcia de propiedades automáticas para implementarlo):
Me gustaría ser capaz de inicializar una colección de objetos Person y obtener programáticamente una representación en JSON llamando a un método ToJSON() de la siguiente forma:
Esto funcionaría igual que el método ToString() de la clase Object de .NET – pero generaría un string en formato JSON con la representación de la colección que podríamos usar en escenarios AJAX en cliente:
Nota: Haciendo clic en la lupa en el debugger veremos un visualizador de text en VS para ver una versión del JSON:
Este formato podemos usarlo con JavaScript en el cliente para instanciar un objeto JavaScript que represente a nuestra colección (nota: ASP.NET AJAX tiene una librería que permite esto).
Implementando el método de extensión ToJSON
Implementar un método de extensión ToJSON es algo muy simple. Todo lo que necesitamos hacer es usar la clase JavaScriptSerializer del namespace System.Web.Script.Serialization, y definir dos métodos de extensión como los siguientes. Uno de los métodos serializa un objeto con cualquier nivel de profundidad, el otro es una sobrecarga que nos permite restringir el grado de profundidad en la recursividad (por ejemplo: ToJSON(2) serializaría sólo 2 niveles del objeto):
Fijaos que estos métodos de extensión están definidos para el tipo “Object” – con lo que podremos usarlos con cualquier objeto en .NET (no sólo con colecciones). Es decir, además de llamar .ToJSON() en las colecciones como anteriormente, podríamos hacerlo para objetos individuales del tipo Person, y con cualquier objeto tipo de .NET
Para usar este método de extensión, lo único que necesitamos es añadir una sentencia using al principio del programa que referencie el namespace donde está definido:
VS 2008 nos da soporte en el intellisense automaticamente en cualquier tipo de objeto:
Nota: A parte de la clase JavaScriptSerializer, .NET 3.5 también incluye la clase System.Runtime.Serialization.DataContractJsonSerializer que podemos usar para la serialización/deserialización en JSON