quarta-feira, 6 de fevereiro de 2013

C# - Criando métodos de extensão

Neste post, acredito que vou ajudar muitas pessoas que trabalham com enumeradores em seus códigos. Vou falar sobre Extension Methods.
Para quem já utilizou os métodos que o System.Linq disponibiliza, de uma forma ou de outra já utilizou métodos de extensão.
Como assim?

Já repararam que quando incluimos o pacote System.Linq em nosso código, as nossas listas passam a ter novos métodos como 'First', 'FirstOrDefault', 'Select', entre outros?

Ótimo, esses são métodos de extensão da interface IEnumerable, ou seja, todas as formas de listagem a partir de agora possuem tais métodos.

Para quem já conhecia o System.Linq, nunca se perguntou como esses métodos apareceram nos nossos objetos IEnumerable? Eu me perguntava há um tempo atrás, antes de conhecer os métodos de extensão, mas pensava que não seria possível criar os meus próprios métodos de extensão, e ai que me enganei.

Há alguns meses, por acaso acabei descobrindo como esses métodos aparecem em nossos objetos, e acredite, é de uma forma muito simples.

Por exemplo, quero criar um método de extensão para os objetos do tipo String, para verificar o tamanho de uma string(assim como o método Length faz), mas com um diferencial de quando a string for nula, quero que seja retornado length = 0 ao invés de obter uma NULL POINTER EXCEPTION.
Simplesmente criaremos uma classe estática com o nome StringExtensions:

StringExtensions.cs

Agora basta incluir o namespace em que o StringExtensions.cs foi criado na classe em que queremos tal funcionalidade:
using ExtensionsMethods.Extensions;

A partir de então, todos os objetos do tipo string terão o método LengthOrDefault.

Legal, agora que já aprendemos como criar um método de extensão, irei mostrar como isso pode nos ajudar trabalhando com enumeradores. Digamos que temos um cadastro de usuário em um sistema e um dos campos que devem ser preenchidos é o tipo de pessoa('Pessoa Física' ou 'Pessoa Jurídica').

Como sabemos, um enumerador não tem descrição, mas ao mesmo tempo, não gostaríamos que na nossa tela, as opções apresentadas fossem 'PessoaFisica', 'PessoaJuridica', ignorando acentuação e o espaço entre as palavras, então como faríamos para vincular uma descrição aos enumeradores? Melhor ainda, não seria perfeito se pudéssemos obter a descrição de um enumerador como uma propriedade do próprio enumerador? (ex: ETipoPessoa.Fisica.Descricao)

Faremos isso, mas ao invés de uma propriedade, iremos criar um método de extensão que recupera a descrição do enumerador através de um atributo do mesmo.

ETipoPessoa.cs

EnumExtensions.cs

Como disse, basta incluir o namespace ExtensionMethods.Extensions na classe onde desejamos obter a descrição do enumerador e..


Executando o código obtivemos o seguinte resultado:

Muito bom, agora conseguimos obter a descrição de um enumerador de forma fácil.
Basta utilizar a criatividade para criar métodos de extensão que nos ajude no nosso dia a dia.

O código fonte pode ser encontrado no link(source) ou através do git em:
https://github.com/fsaalmeidinha/extensionmethods.git

Qualquer dúvida ou crítica, podem comentar no post ou entrar em contato por email ou skype(informados à direita).

6 comentários:

  1. Muito interessante seu blog Felipe!!

    Aproveito a oportunidade e peço que, se possível, faça um post demonstrando alguns dos métodos do linq, pois sei mto pouco ( por exemplo, pq uns tem (function(t) t.id = id select t) esse select t no final e outros não tem function (t) t.id = id) ????)

    Obrigado e continue com o bom trabalho!!!

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Opa, valeu Cristiano, proximo post falarei sobre as funções mais importantes do LINQ, fique atento!!

    ResponderExcluir
  4. Legal, só precisa alterar essa foto e colocar uma foto um pouco mais arrumadinha!!! Rs.

    ResponderExcluir
  5. Excelentes explicações. Pesquisando sobre linq, acabei chegando até seu blog.
    Muito didático!

    ResponderExcluir
  6. Você parou de nos ajudar com duas ótimas dicas?

    ResponderExcluir