Olá, a intenção desse post não é explicar em detalhes como manipular esse recurso que foi incluso na versão 3.0 do C#, mas sim tentar mostrar, com alguns pequenos exemplos, as possíveis maravilhas que o mesmo nos permite fazer. Em algum momento, programando, você já deve ter precisado de algum método simples que não existe naquela classe que você está utilizando, e o pior, essa classe é de terceiros e você não possui permissão de alteração ou o fonte para isso, e aí qual a solução? Vamos a um exemplo:

protected void btnOk_Click(Object sender, EventArgs e) {
	pessoa.Altura = Decimal.Parse(txtAltura.Text);
	pessoa.Peso = Decimal.Parse(txtPeso.Text);
	//... more code ...
}

De cara nós já vemos na primeira linha uma possibilidade de erro caso o conteúdo do txtAltura ou txtPeso não seja um número válido, que tal checarmos se o valor está em um formato numérico válido para conversão?? Bom, infelizmente nós não temos um método unica e exclusivamente para esta finalidade, mas temos um outro que “quebraria nosso galho” e poderíamos recorrer da seguinte forma:

protected void btnOk_Click(Object sender, EventArgs e) {
	decimal altura;
	decimal peso;
	if(Decimal.TryParse(txtAltura.Text, out altura) && Decimal.TryParse(txtPeso.Text, out peso)) {
		pessoa.Altura = altura;
		pessoa.Peso = peso;
	}
	//... more code ...
}

Bom, estamos garantindo que nosso código não falhará no caso de uma entrada inválida. Mas convenhamos, não está mais tão bonito de se ler, eu fui forçado a criar 2 variáveis por não existir nenhum método que apenas cheque se uma string está em um formato númerico válido, tanto em String como em Decimal, com isso já estamos aí com 5 linhas de código.

Mas o que vocês acham se pudéssemos fazer da forma abaixo?

protected void btnOk_Click(Object sender, EventArgs e) {
	if(txtAltura.Text.Is<Decimal>() && txtPeso.Text.Is<Decimal>()) {
		pessoa.Altura = txtAltura.Text.To<Decimal>();
		pessoa.Peso = txtPeso.Text.To<Decimal>();
	}
	//... more code ...
}

Bom, eu achei que ficou bem fácil de ler tudo que está acontecendo aí, vocês também não acham? A questão é, como nós vamos escrever assim se a classe String não possui os métodos Is<T>() e o método To<T>()?? Extension Methods eu respondo :D
Você mesmo implementa esses métodos e diz que eles afetam a classe String, feito isso será possível fazer construções do tipo: “12″.Is<int>() mesmo não tendo o código fonte da classe String e isso é possível para qualquer classe. Quem é curioso já deve ter visto que o Linq utiliza bastante deste recurso de Extension Methods, todas as coleções no .net 3.5 estão recheadas de facilidades como Sum, Average, Any, All e muitos outros que foram implementados através do recurso aqui apresentado, ou seja, não foi preciso meter a mão no código das coleções para adicionar estes novos comportamentos, isso é demais.
Com um recurso assim, podemos tornar nosso código muito simples para quem está lendo, e para quem estava acostumado com classes Helper pode repensar em como usar esse recurso no lugar dos Helpers, pois a finalidade é bem parecida sendo o Extesion Methods mais poderoso ;)

Para quem quiser se aprofundar no recurso nada melhor do que o site oficial: http://msdn.microsoft.com/en-us/library/bb383977.aspx