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 ![]()
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

1 comentário
Feed de comentários deste artigo
2009-07-22 às 23:26
Gustavo Rocha
String nao tem Is e To no seu visual studio pq aqui no meu framework, teve um trouxa que deixou essas funcoes aqui.