Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.
Essa funcionalidade é chamada de Extension Methods.
Criando um Extension Method
Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a definição de um método de validação (estático) em uma classe utilitária (estática).
static class Program
{
static void Main(string[] args)
{
string emailCliente = System.Console.ReadLine();
if (!Utilidades.IsEmailValido(emailCliente))
System.Console.WriteLine("E-mail informado inválido.");
}
}
Usando um Extension Method a solução é parecida, mas a utilização é mais elegante.
if (!emailCliente.IsEmailValido())
System.Console.WriteLine("E-mail informado inválido.");
A criação do Extension Method se resume a definição de uma classe estática com um método estático.
namespace Utilidades
public static class Extensoes
{
public static bool IsEmailValido(this string email)
{
return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
}
}
}
Notem o keyword this antes da declaração do primeiro parâmetro. Ele é responsável por passar ao compilador que o método IsEmailValido é aplicável a todos os objetos do tipo string.
E para utilizar o extension method basta importar o namespace que contém a classe estática usando o statement using. Sendo que não é necessária a importação caso as classes estejam dentro do mesmo namespace.
using Utilidades;
Passando parâmetros para o Extension Method
namespace Utilidades
public static class Extensoes
{
public static bool IsMaiorQue(this string s, int tamanho)
{
return s.Length > tamanho;
}
}
}
string nome = "Joao da Silva";
if (nome.IsMaiorQue(10))
System.Console.WriteLn("Nome só pode ter 10 caracteres");
Com essa introdução dá para ter uma pequena idéia das possibilidades. Vale lembrar que também é possÃvel criar extension methods para interfaces e generics.
Abaixo três boas referências que valem à pena dar uma lida.
Recent Comments