Extensions Methods

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.

Anúncios
Esse post foi publicado em C#. Bookmark o link permanente.

Uma resposta para Extensions Methods

  1. I like the helpful information you provide in your articles.
    I’ll bookmark your blog and check again here frequently. I’m quite
    certain I will learn lots of new stuff right here!
    Best of luck for the next!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s