Anterior Próximo

Extension Methodspublicado em 14/12/2009

Presentes a partir da versão 3.0 do .net framework, os Extension Methods ou Métodos de Extensão, nos dão a possibilidade de extender tipos já existentes sem alterar o código original ou criar tipos derivados.

Apesar de possuir características de métodos estáticos, os Extension Methods funcionam como se fossem métodos de instância.

Sua declaração é extremamente simples, basta lembrarmos de duas coisas:

  • Os métodos de extensão devem necessariamente ser estáticos e ser declarados dentro de classes estáticas.
  • O modificador this precedendo o primeiro argumento, indica o tipo que está sendo estendido.

Como exemplo, vamos supor a necessidade de criar um método que receba um texto qualquer e retorne o mesmo texto escrito em letras maiúsculas e terminado por sinais de exclamação, dando a impressão de grito.

public static class StringExtensions
{
    public static string Gritar(this string texto)
    {
       return texto.ToUpper() + " !!!!";
    }
}

Utilizando:

"mengão campeao".Gritar();
"ahh".Gritar();
"brasil".Gritar();

// Saida: MENGÃO CAMPEAO !!!!
// Saida: AHH !!!!
// Saida: BRASIL !!!!

Não temos nenhuma restrição quanto a que tipos estender, qualquer classe pode ser facilmente estendida.

Para exemplificar isso, vamos imaginar agora a seguinte situação onde temos uma determinada classe Pessoa:

public class Pessoa
{
   public string PrimeiroNome { get; set; }
   public string UltimoNome { get; set; }

   public Pessoa(string primeiroNome, string ultimoNome)
   {
      this.PrimeiroNome = primeiroNome;
      this.UltimoNome   = ultimoNome;
   }
}

Queremos então criar uma método que retorne o primeiro e o ultimo nome de uma pessoa sem ter que alterar a classe Pessoa.

public static class PessoaExtensions
{
   public static string NomeCompleto(this Pessoa pessoa)
   {
      return pessoa.PrimeiroNome + " " + pessoa.UltimoNome;
   }	
}

Utilizando:

Pessoa pessoa = new Pessoa("Diogo","Menezes");
pessoa.NomeCompleto();

// Saida: Diogo Menezes

Como pudemos ver, os extension methods são extremamente poderosos e úteis. Com um pouco de criatividade, é possivel criar métodos incríveis.

Para finalizar criei um método de extensão para números inteiros que nos ajuda a verificar se o número existe em uma lista.


public static class IntExtensions
{
	public static bool In(this int numero, int[] lista)
        {
            if (lista.Length == 0)
                return false;
            else
                return (bool)lista.Contains(numero);
        }
}

Utilizando:

if(1.In(new int[] { 2,3,55,1 })
    Console.Write("Achei :)");
else
    Console.Write("Não achei :(");

// Saida: Achei :)


Tags:

retweet

BBCode permitido - [code], [pre], [b], [i], [u], [del], [url], [left], [right], [center]

  • 15/12/2009 10:45 - maxcn

    Não conhecia esse tipo de método. Realmente muito bom!! Valeu

  • 15/12/2009 13:14 - Felipe Carvalho

    Boas novidades do Framework 3.0
    Realmente muito útil. Ja enviei o link para minha lista de contatos!
    ABS

  • 15/12/2009 18:17 - Maurício

    Fala Diogo, legal o artigo! Só tem um typo no segundo exemplo, acho que onde está escrito "public void string", provavelmente você quis dizer "public static string". Lembrando que os extensions methods, além de terem que estar dentro de classes estáticas, devem ser declarados como estáticos eles mesmos também.

  • 15/12/2009 20:08 - Diogo Menezes

    Boa observação Maurício ! Realmente faltava o static no segundo exemplo. Já fiz a correção.

    Abraços.


Ir direto para o topo