Estendendo sem herança (Extension Methods) em C#

Sabemos que usar herança para reaproveitar código não é a melhor solução. Sendo assim, existe algum recurso do C# que nos permita reaproveitar código sem ter que usar herança? Sim existe, e seu nome é Extension Methods.

Extension Methods é o recurso do C# que lhe permite “adicionar” métodos a uma classe já existente sem ter que estendê-la (por herança), recompilá-la ou alterá-la e pode ser definido como um tipo especial de método estático. Entretanto, o código cliente de um método de extensão o acessa como se este fosse um método não-estático. Em outras palavras, o método de extensão apesar de ser estático, é acessado pela referência. Tecnicamente falando, ou seja, por debaixo dos panos não é bem assim que acontece, mas isso é uma discussão mais aprofundada. O importante aqui é como o desenvolvedor escreve a chamada.

A própria API do .NET faz um uso interessante de Extension Methods para estender as classes que implementam a interface IEnumerable. Esses métodos são conhecidos como operadores padrão LINQ. Alguns deles: Count(), Distinct(), ElementAt(), First(), FirstOrDefault(), GroupBy(), OfType(), Sum(), ToList() e muitos outros. Para destacar os extension methods, a IDE do Visual Studio utiliza o ícone de chamada de método com uma seta azul direcionada para baixo, conforme mostra a figura abaixo.

E então, como faço para criar meus próprios Extension Methods ?
Read More…