Outro dia estava trabalhando em um projeto onde precisava criar alguns métodos a mais para uma dll que havia sido gerada para um outro aplicativo. Porém, como não tinha o código fonte dela estava prestes a escrever uma nova classe e implementar os métodos que estava precisando, mas antes de começar a codificar, me lembrei que a partir da versão 3.0 do Net Framework, a Microsoft incluiu uma funcionalidade muito bacana chamada Extension Methods.

Mas o que são Extension Methods?

Basicamente é uma forma de você “inserir” código em classes já compiladas mesmo que estas sejam seladas (sealed) como a maioria das classes do .Net. Desta forma podemos incrementar nossas classes com métodos que criamos sem a necessidade de realizar uma recompilação da mesma.

Mas para que isso fique mais claro, vamos ao exemplo.

Crie um projeto do tipo C# -> Console Application, dê o nome de “ExtensionMethods”.

Agora crie um novo projeto do tipo C# –> Class Library, e dê o nome dele de MyClass. Agora renomeie a Class1.cs para Client.cs. Seu projeto deverá estar como na figura 01.

extension_01
Figura 01 – Solution Explorer

 

Agora, abra o arquivo Client.cs e adicione o código da listagem 01.

Listagem 01 – class Client.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyClass
{
    public sealed class Client
    {
        public string Name { get; set; }
        public string Email { get; set; }

        public bool EmailIsValid()
        {
            return !string.IsNullOrEmpty(Email);
        }
    }
}

Observem que criamos duas propriedades e um método que “valida” o email do cliente.

Vamos criar nossa chamada à classe Client. Abra o arquivo Program.cs e insira o código da listagem 02 no método Main da classe.

Listagem 02 – chamada a classe Cliente

var cl = new Client
              {
                 Email = "lima@lucianolima.com.br",
                 Name = "Luciano Lima"
              };

    Console.WriteLine( cl.EmailIsValid() ? "Email Válido" : "Email Inválido" );
    Console.ReadLine();

 

Ao executar este código ele irá apenas escrever Email Válido porque a propriedade Email está preenchida.

Bem, digamos que você precise realizar a validação do Nome do Cliente, mas sem ter que mexer na classe Client, é ai que Extension Methods entra em ação.

Adicione uma nova classe no projeto ExtensionMethods, dê o nome a ela de “ClientExtension.cs” e insira o código da listagem 03.

Listagem 03 – class extension

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyClass;

namespace ExtensionMethods
{
    public static class ClientExtension
    {
        public static bool NameIsValid(this Client client)
        {
            return !string.IsNullOrEmpty(client.Name);
        }
    }
}

O importante nessa classe é a forma como criamos o método, observem que o segredo para a funcionalidade de extensão é a palavra “this” que faz referencia à classe que queremos agregar valor, o restante é código puro e simples.

Agora quando for utilizar a funcionalidade, o Visual Studio irá detectar que este método é uma extensão para a classe Client, conforme figura 02 e figura 03.

extension_02

Figura 02 – método estendido na classe Client

extension_03

Figura 03 – ToolTip mostrando que o método é uma extensão.

 

Extension Methods como falei acima pode ser aplicado a todas as classes do dot Net, então caso precise de um método exclusivo para trabalhar com string basta criar sua classe de extensão e implementar o método que achar necessário. Mas cuidado, a manutenção deste tipo de código pode ser um pouco árdua por isso, pense bem antes de sair criando extension methods.

 

Enjoy!!