Já pensou na possibilidade de implementar seus próprios métodos e torna-los acessiveis de objetos já existentes. Criar novas funcionalidades e utiliza-las a partir de tipos nativos da framework sem que seja necessário recompilar o código fonte ou modificar nada ? Este é o poder dos Extensions Methods.

Criado principalmente para dar suporte as operações do LINQ, o Extensions Methods permite de forma fácil a criação de métodos que possam ser acessíveis de tipos já existentes sem a necessidade de alteração de código fontes. É uma tremenda mão na roda para a criação de novas funcionalidade, principalmente para criação de bibliotecas de pequenas funcionalidades da aplicação (util).

1. Regras Básicas:

Para um método poder ser utilizado como um método extensível, existem algumas regras a serem seguidas:

  • A classe tem de ser estática
  • O método tem de ser estático
  • O Tipo do método define o retorno dele, não precisa ser o mesmo do objeto invocador
  • O parâmetro do método é aonde será definido a que tipo aquela nova funcionalidade será atrelada, esta definição é feito através da palavra reserva this + tipo + nome do parâmetro
  • A classe tem de estar em um arquivo único

2.Exemplo básico:

Para um exemplo básico, vamos criar um método que converte string para inteiro e caso o valor passado não possa ser convertido, ele retorna zero. Conforme a Listagem 1 veja que criamos uma classe estática chamada Extensions(mas poderia ser qualquer nome) com um método estático chamado ToInt aonde no parâmetro eu passo This String S que me diz que este método irá trabalhar com objetos do tipo String.

namespace Artigo.ExtensionsMethods

{

    public static class Extensions

    {

        public static int ToInt(this string s)

        {

            int outInt = 0;

            int.TryParse(s, out outInt);

            return outInt;

        }

    }

}

Listagem 1. Extension Method que convert String para Inteiro

Para utilizar-mos nosso método extensivo, devemos adicionar o namespace do projeto(que contem o extension method) na classe quer irá utilizar o nosso método, conforme a listagem 2:

using Artigo.ExtensionsMethods;

Listagem 2. Adicionar o namespace na classe utilizadora

E com isto já conseguimos utilizar nosso novo método. Para testarmos vamos criar um variável do tipo string conforme a listagem 3. Veja que o intellisense já reconhece nosso método e o traz na lista de opções conforme a Figura 1


Figura 1. Intellisense mostrando o Extension Method


string sNumeral = "150";

int iNumero = sNumeral.ToInt();

/*Retorno:150*/

Listagem 3. Código utilizando o Extension Method para converter String para Int

Veja que não foi necessário passar nenhum parâmetro, isto por que ele já é embutido através do tipo do objeto que esta chamando o método.

3. Extension Method mais Funcional:

Vamos agora criar um Extension Method que tenha uma funcionalidade um pouco mais complexa e exija que utilizemos mais de um parâmetro. Por exemplo:  passado uma frase ou palavra, quero saber quantas,de uma determinada letra, existem nela. Segue na Listatem 4 o código do método contador de letras:

public static int QtdLetra(this string palavra, char letra)

{

     return palavra.Where(c => c.Equals(letra)).Count();

}

Listagem 4. Extension Method para contar letras

Veja que o segundo parâmetro não precisa conter a palavra this. O método foi implementado utilizando LINQ aonde a aplicação da palavra WHERE para um tipo string nos permite navegar no array de caracteres que o forma.

Para utilizar-mos o QtdLetra, basta seguirmos a mesma tematica de adicionar a referencia e o namespace a classe utilizadora, mas notem que agora temos de passar um parâmetro obrigatório conforme a Figura 2 mostra:

Figura 2. Extension Method com mais de um parâmetro

Segue na Listagem 5 um exemplo básico da utilização do nosso novo método, criamos uma lista de string e colocamos alguns valores, depois percorremos essa lista analisando quantas letras O cada frase contem:

List<string> palavras = new List<string>

{

   "Microsoft .Net Framework",

   "Extensions Methods",

   "Ouviram do Ipiranga as margens plácidas"

};

        int cont = 0;

        foreach (string s in palavras)

            cont = s.QtdLetra('o');

        /*Retornos:

         [0]:3

         [1]:2

         [2]:1

         */

Listagem 5. Utilizando o Extension Method QtdLetra

4. Conclusão:

Acredito que depois desta pequena demonstração, seja possível ver a facilidade e o poder que a utilização dos Extensions Methods pode trazer aos códigos implementados. A possibilidade de utilização de métodos como se fosse nátivos a tipos nátivos da framework abre um leque de opções de novas funcionalidades.