Outro dia estava trabalhando em um projeto onde precisava criar alguns métodos a mais para uma dll que havia sido gerada para um outro aplicativo. Porém, como não tinha o código fonte dela estava prestes a escrever uma nova classe e implementar os métodos que estava precisando, mas antes de começar a codificar, me lembrei que a partir da versão 3.0 do Net Framework, a Microsoft incluiu uma funcionalidade muito bacana chamada Extension Methods.
Mas o que são Extension Methods?
Basicamente é uma forma de você “inserir” código em classes já compiladas mesmo que estas sejam seladas (sealed) como a maioria das classes do .Net. Desta forma podemos incrementar nossas classes com métodos que criamos sem a necessidade de realizar uma recompilação da mesma.
Mas para que isso fique mais claro, vamos ao exemplo.
Crie um projeto do tipo C# -> Console Application, dê o nome de “ExtensionMethods”.
Agora crie um novo projeto do tipo C# –> Class Library, e dê o nome dele de MyClass. Agora renomeie a Class1.cs para Client.cs. Seu projeto deverá estar como na figura 01.
Figura 01 – Solution Explorer
Agora, abra o arquivo Client.cs e adicione o código da listagem 01.
Listagem 01 – class Client.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyClass
{
public sealed class Client
{
public string Name { get; set; }
public string Email { get; set; }
public bool EmailIsValid()
{
return !string.IsNullOrEmpty(Email);
}
}
}
Observem que criamos duas propriedades e um método que “valida” o email do cliente.
Vamos criar nossa chamada à classe Client. Abra o arquivo Program.cs e insira o código da listagem 02 no método Main da classe.
Listagem 02 – chamada a classe Cliente
var cl = new Client
{
Email = "lima@lucianolima.com.br",
Name = "Luciano Lima"
};
Console.WriteLine( cl.EmailIsValid() ? "Email Válido" : "Email Inválido" );
Console.ReadLine();
Ao executar este código ele irá apenas escrever Email Válido porque a propriedade Email está preenchida.
Bem, digamos que você precise realizar a validação do Nome do Cliente, mas sem ter que mexer na classe Client, é ai que Extension Methods entra em ação.
Adicione uma nova classe no projeto ExtensionMethods, dê o nome a ela de “ClientExtension.cs” e insira o código da listagem 03.
Listagem 03 – class extension
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyClass;
namespace ExtensionMethods
{
public static class ClientExtension
{
public static bool NameIsValid(this Client client)
{
return !string.IsNullOrEmpty(client.Name);
}
}
}
O importante nessa classe é a forma como criamos o método, observem que o segredo para a funcionalidade de extensão é a palavra “this” que faz referencia à classe que queremos agregar valor, o restante é código puro e simples.
Agora quando for utilizar a funcionalidade, o Visual Studio irá detectar que este método é uma extensão para a classe Client, conforme figura 02 e figura 03.
Figura 02 – método estendido na classe Client
Figura 03 – ToolTip mostrando que o método é uma extensão.
Extension Methods como falei acima pode ser aplicado a todas as classes do dot Net, então caso precise de um método exclusivo para trabalhar com string basta criar sua classe de extensão e implementar o método que achar necessário. Mas cuidado, a manutenção deste tipo de código pode ser um pouco árdua por isso, pense bem antes de sair criando extension methods.
Enjoy!!