Métodos de Extensão

Uma característia presente nas linguagens de dinâmicas e que também está disponível na plataforma .NET, é a capacidade de extender uma classe sem a que seja necessário uma herança da mesma, o que seria impossível numa classe selada, que não permite que seja herdada.
Veja um exemplo em ruby (trecho retirado do artigo Micro Tutorial de Ruby – Parte I):

class String
def empty?
self.nil? || self.size == 0
end
end

nome = "Sebastião Relson"
nome.empty?

Veja como fica a saída do programa utilizando o IRB:

relson@lenny-amd64:~$ irb
irb(main):001:0> class String
irb(main):002:1> def empty?
irb(main):003:2> self.nil? || self.size == 0
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> nome = "Sebastião Relson"
=> "Sebasti\303\243o Relson"
irb(main):007:0> nome.empty?
=> false
Agora um exemplo em c# .NET:

using System;

namespace MetodosExtensao
{

class MainClass
{
    public static void Main(string[] args)
    {
        int i = 1;
        Console.WriteLine(i.Negativo());
    }
}

static class ExtensoaInteiro
{
    public static int Negativo(this int i)
    {
        return -i;
    }
}
}

Nesse exemplo a saída seria somente:

-1

Para facilitar a inserção do código no blog e deixar e exemplo mais simples coloquei as classes no mesmo arquivo. O código foi retirado com adaptações do livro Microsoft Visual C# 2008, Passo a Passo - John Sharp.

Para finalizar leia também o artigo de um grande amigo meu, o memorável Rafael Camargo que fala a respeito que também fala de métodos de extensão o artigo é C#: Extension Methods & Speech.