LINQ - Conceitos e fundamentos - Métodos de extensão


O que são os Métodos de extensão (Extension Methods) ?

Uma das funcionalidades implementadas na nova versão da plataforma .NET ( versão 3.5) são os métodos de extensão eles permitem ampliar a funcionalidade ja existente em uma classe ou tipo.

Para dar suporte ao LINQ foi necessário adicionar novos métodos em classes/tipos já existentes sem usar o recurso da herança ou ter que recompilar a classe/tipo original.

Isso foi necessário pois muitas classes/tipos não permitiam a modificação por meio da herança e além disso teriam que continuar compatíveis com as versões anteriores.

Sem utilizar os métodos de extensão quais as opções que temos para incluir novas funcionalidades em classes e interfaces ?

Vejamos:

  1. Acessar o código fonte e incluir a funcionalidade diretamente. Muito bem , só que teríamos que ter acesso ao código fonte , e, isso quase sempre não é possível;
  2. Usando herança para herdar a nova funcionalidade , mas muitas classes não dão suporte a herança;
  3. Criar novamente a funcionalidade desde o princípio o que seria trabalhoso , complexo e demorado;

Mesmo optando por usar um dos métodos acima, se fosse viável é claro, teríamos que nos preocupar em manter a compatibilidade com as versões anteriores tornando o processo complexo e trabalhoso.

Uma solução elegante para resolver estes problemas e conseguir o objetivo almejado foi implementar os métodos de extensão que fornecem um mecanismo para estender as classes/tipos já existentes, mesmo quando a classe/tipo não da suporte a herança, com novos métodos que podem ser usados como métodos normais de instância.

Nota: Os métodos de extensão são uma característica específica da plataforma .NET e não tem correspondência nos conceitos de orientação a objeto padrão.

Veja por exemplo a classe System.String ; ela não dá suporte a herança e não podia ser alterada ou estendida. Eu disse não podia, pois na versão 3.5 do .NET Framework podemos alterá-la usando os métodos de extensão.

Vamos supor, apenas a título de demonstração, que você deseja estender a classe System.String usando o recurso dos métodos de extensão, incluindo uma nova função chamada FirstCharUpper() (belo nome !!!) que tem o objetivo de converter  o primeiro caractere de uma string em caixa alta, assim , macoratti seria convertido para Macoratti.

O código necessário para realizar tal tarefa é muito simples e consiste de uma única linha de código:

StrConv(STRING, VbStrConv.ProperCase)

Como podemos implementar este recurso como um método de extensão ???

Na linguagem Visual Basic para implementar os métodos de extensão você tem que seguir algumas regras, eí-las:

A restrição de somente poder usar o recurso em módulos deve-se ao fato de os módulos não poderem participar de cadeias herdadas e de não existirem como módulos parciais simplificando assim o processo.

A título de exemplo abra o Visual Basic 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application com um nome sugestivo qualquer;

Inclua um módulo ao seu projeto via opção Project -> Add Module e informe o nome MetodosExtensao.vb;

A seguir inclua o código abaixo no  módulo criado;

No código acima temos que :

- Estamos usando o namespace System.RuntimeCompileServices ;

- A função FirstCharUpper() que definimos possui o atributo <Extension()>;

- O primeiro parâmetro do tipo deve ser o tipo que estamos estendendo , no caso a classe System.String; (Não podemos usar Optional nem ParamArray)

Agora abra o editor de código para o formulário form1.vb e defina os namespaces e o código conforme a figura a seguir:

Perceba que o a digitar o ponto após a string s , o intellisense exibe os métodos de extensão com uma seta azul para baixo que indica que o método não faz parte da classe mas foi agregado a mesma. (Não devemos usar o recurso para substituir os métodos de instância existentes na classe original)

Podemos então concluir que os métodos de extensão são uma forma elegante de resolver o problema de incluir novas funcionalidades que dão suporte ao LINQ e que podem ser usadas com cautela e bom senso. Conselho : Use , se preciso , mas não abuse.

Até o próximo artigo...


José Carlos Macoratti