Métodos de Extensão em .Net

Na versão 3.0 do C#, lançada em 2008, a Microsoft introduziu uma funcionalidade no .Net Framework: os métodos de extensão. Essa feature possibilita você incluir métodos em classes existentes sem que haja necessidade de implementar relações de herança, com a criação de tipos derivados, e assim ter de recompilar o código e fazer modificações no arquivo original.

Um exemplo comum é o LINQ, que usa métodos de extensão implementados nas classes IEnumerable e IEnumerable<T>.

O método First() devolve o primeiro item de uma coleção:


List<int> list = new List<int>() { 2, 3, 6, 9, 12, 22, 78 };

int n = list.First();

 

Como Escrever um Método de Extensão

Os métodos de extensão são métodos estáticos que são invocados da mesma maneira que métodos de instância.

Passo-a-passo para escrever um método de extensão:

  • Crie uma classe estática
  • Definir o método de extensão
    • Crie um método estático;
    • O primeiro parâmetro do método especifica em qual classe o método será inserido e deve ser precedido pela palavra-chave this;
    • No client code adicione uma diretiva using que se refere ao namespace da classe onde foi escrito o método de extensão;
    • Execução: Como eu criei dois métodos de extensão para a classe Char, eles agora fazem parte desta classe. Declare uma variável do tipo Char e chame o método IsVowel(), que determina se uma letra é vogal.
namespace MyExtensions
{
    public static class CharExtensions
    {
        public static bool IsVowel(this Char c)
        {
             return (c.Equals('a') || c.Equals('A')
                     || c.Equals('e') || c.Equals('E')
                     || c.Equals('i') || c.Equals('I')
                     || c.Equals('o') || c.Equals('O')
                     || c.Equals('u') || c.Equals('U'));
        }

        public static bool IsConsonant(this Char c)
        {
             return !c.IsVowel();
        }
    }
}
using MyExtensions;

namespace ExtensionMethods
{
    class Program
    {
        static void Main(string[] args)
        {
            Char ch = 'a';
            Console.WriteLine("a é vogal: " + ch.IsVowel());

            ch = 'E';
            Console.WriteLine("E é vogal: " + ch.IsVowel());

            Char c = 'x';
            Console.WriteLine("x é consoante: " + c.IsConsonant());

            Console.ReadLine();
        }
    }
}

Obs: Note que aqui os métodos de extensão não recebem nenhum argumento na chamada, pois o único parâmetro na sua assinatura é o <this Classe var>, que indica que este método está sendo inserido em tal classe. Em seguida vem a variável que vai invocá-lo.

métodos de extensão_img1

O IntelliSense mostra a você quando um método é de extensão pela seta para baixo ao lado do ícone de método seguido da legenda (extension).

métodos de extensão_img2

Lembre-se…

  • Métodos de extensão são específicos à plataforma .Net;
  • Quando usar: se você usa uma classe de um framework e gostaria de incluir um comportamento que ela não possui;
    • Exemplo: um método que retorna uma soma de números primos inteiros de uma sequência.
  • Como implementar: tenha como base a classe na qual você deseja incluir o método de extensão. Por exemplo, a classe String.
    • Crie uma classe estática chamada StringExtensions, com o mesmo namespace;
    • Crie um método estático com o primeiro parâmetro: this String s.
    • No código que vai executar o método, adicione uma diretiva using StringExtensions;
    • Execute-o da mesma maneira que você faria com um método de instância.
  • Você não pode criar métodos de extensão em classes não estáticas, como é o exemplo da classe Math. Nesse caso, crie uma classe normalmente e assim implemente suas funcionalidades;
  • A sintaxe para invocar um método de extensão é igual à sintaxe de invocar um método comum;
  • É seguro: o código intermediário gerado pelo compilador traduz a chamada de um método de extensão para uma chamada de método estático. Não há quebra de encapsulamento porque os métodos de extensão não podem acessar as variáveis privadas nas classes em que eles atuam.

 

Última revisão em: 31/05/16.

Anúncios

2 Respostas para “Métodos de Extensão em .Net

  1. E combinando métodos de extensão com Genéricos várias coisas interessantes podem ser implementadas como esse método que retorna o “Display Attribute” de uma propriedade.

    public static string GetDisplayAttr(this T source)
    {
    FieldInfo fi = source.GetType().GetField(source.ToString());

    DisplayNameAttribute[] attributes = (DisplayNameAttribute[])fi.GetCustomAttributes(
    typeof(DisplayNameAttribute), false);

    if (attributes != null && attributes.Length > 0) return attributes[0].DisplayName;
    else return source.ToString();
    }

  2. Pingback: Classes Utilitárias em Projetos de Software | Thiago Vidal·

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