<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wagner Andrade &#187; Extension Methods</title>
	<atom:link href="http://www.wagnerandrade.com/blog/tag/extension-methods/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wagnerandrade.com/blog</link>
	<description>Simplificando a WEB</description>
	<lastBuildDate>Sun, 18 Oct 2009 05:58:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Phantom: Easy reflection in .NET</title>
		<link>http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 05:25:55 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Extension Methods]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Phantom]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/</guid>
		<description><![CDATA[English version here.
Phantom DOWNLOAD.
Resolvi publicar um utilitário — inclusive com seu código (Github) — que venho usando à algum tempo em meus projetos .NET, o Phantom.
Phantom é um utilitário que torna fácil fazer reflexão em objetos. Para quem não sabe, reflexão consiste basicamente em trabalhar com objetos sem saber seu tipo, ou seja, chamar seus [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wagnerandrade.com/phantom/readme.html">English version here</a>.</p>
<p><a href="../../phantom/Phantom.zip">Phantom DOWNLOAD</a>.</p>
<p>Resolvi publicar um utilitário — inclusive com <a href="http://github.com/wagnerandrade/Phantom">seu código (Github)</a> — que venho usando à algum tempo em meus projetos .NET, o <a href="http://www.wagnerandrade.com/phantom/Phantom.zip">Phantom</a>.</p>
<p>Phantom é um utilitário que torna fácil fazer reflexão em objetos. Para quem não sabe, reflexão consiste basicamente em trabalhar com objetos sem saber seu tipo, ou seja, chamar seus métodos e propriedades.</p>
<h3>Como usa isso?</h3>
<p>Para iniciar o uso do <strong>Phantom</strong> basta adicionar isso na sua classe:</p>
<pre>using Phantom;</pre>
<p>Simples! Isso faz com que aparece alguns métodos (<a href="http://www.wagnerandrade.com/blog/tag/extension-methods/">extension methods</a>) em todos os objetos.</p>
<h3>Ok, mas o que eu posso fazer?</h3>
<p>Get e set em propriedades, invocar métodos, pegar todas as propriedades e mais em objetos que você nem sabe o Type. Sim, isso é legal!</p>
<p>Vou usar C# nos exemplos. Notem que sempre manipulo object e nunca um tipo especifico.</p>
<h3>Pegando (get) valor de uma propriedade</h3>
<pre>object person = new Person { Name = "Arthur", Age = 4 };

person.Get("Name");

&gt;&gt; Arthur</pre>
<h3>Atribuindo (set) valor de uma propriedade</h3>
<pre>person.Set("Name", "Francine");</pre>
<h3>Pegando todas as propriedades</h3>
<pre>var properties = person.Values();

foreach(var property in properties)
{
    Console.WriteLine(property.Key + " = " + property.Value);
}

&gt;&gt; Name = Arthur
&gt;&gt; Age = 4</pre>
<h3>Bom para usar com objetos anônimos</h3>
<p>Já falei de objetos anônimos <a href="http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/">aqui</a>.</p>
<pre>public void PrintName(object target)
{
    Console.WriteLine(target.Get("Name"));
}

PrintName(new { Name = "Wagner" });

&gt;&gt; Wagner</pre>
<h3>Importando valores de outros objetos</h3>
<pre>object animal = new Animal { Age = 20 };

person.Import(animal);

person.Get("Name");
person.Get("Age");

&gt;&gt; Arthur
&gt;&gt; 20</pre>
<h3>Invocando um método</h3>
<pre>object name = "Francine"; 

name.Invoke("ToUpper");

&gt;&gt; FRANCINE</pre>
<p>Existem outras utilidades, mas por hoje é só!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/10/phantom-easy-reflection-in-net/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Usando tipos anônimos como parâmetro</title>
		<link>http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/#comments</comments>
		<pubDate>Wed, 13 May 2009 03:00:00 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Anonymous Types]]></category>
		<category><![CDATA[Extension Methods]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=94</guid>
		<description><![CDATA[Quando a Microsoft anunciou os tipos anônimos (Anonymous Types) eu fiquei bastante contente, era possível criar tipos rapidamente de uma forma muito fácil. Para quem ainda não conhece essa nova funcionalidade aqui vai o link.
Olhando a sintaxe de construção de um tipo anônimo logo associei aos arrays associativos das linguagens de script, conhecidos como Hash. [...]]]></description>
			<content:encoded><![CDATA[<p>Quando a Microsoft anunciou os tipos anônimos (Anonymous Types) eu fiquei bastante contente, era possível criar tipos rapidamente de uma forma muito fácil. Para quem ainda não conhece essa nova funcionalidade <a href="http://msdn.microsoft.com/pt-br/library/bb384767.aspx" target="_blank">aqui vai o link</a>.</p>
<p>Olhando a sintaxe de construção de um tipo anônimo logo associei aos arrays associativos das linguagens de script, conhecidos como <em>Hash</em>. O C# sempre teve o objeto <em>Hashtable</em>, mas não é flexível comparando com linguagens como Ruby ou Javascript. Só pra exemplificar o que estou dizendo:</p>
<p>No Ruby posso chamar um método passando um hash como parâmetro, sintaxe bastante utilizada no Ruby on Rails, dessa forma:</p>
<pre>link_to("Profile", :controller =&gt; "profiles", :action =&gt; "show")
link_to("Profile", :controller =&gt; "profiles", :id =&gt; @id)</pre>
<p>Nas duas linhas de exemplo os dois últimos itens formam uma <em><a href="http://msdn.microsoft.com/pt-br/library/system.collections.hashtable.aspx" target="_blank">Hashtable</a></em>, no caso do Ruby se chama <em>Hash</em>. Do lado do método também fica fácil de capturar o que foi passado. Com tipos anônimos do C# podemos fazer uma sintaxe bem próxima, que ficaria assim:</p>
<pre>LinkTo("Profile", new { Controller = "profiles", Action = "show" });
LinkTo("Profile", new { Controller = "profiles", Id = id });</pre>
<h3>Mas porque utilizar essa forma de passar parâmetros?</h3>
<p>É elegante e limpo em alguns casos. Alguns métodos realizam funções onde é necessário informar MUITOS parâmetros para que se tenha um bom nível de customização da ação que será realizada. E como alguns parâmetros são opcionais acabamos tendo que criar várias sobrecargas para o mesmo método, afim de facilitar a vida de quem vai usar.</p>
<p>No exemplo acima estamos utilizando um método cria um link HTML em um ambiente MVC. Como são muitos parâmetros (texto, controller, action, style, class, id, querystring…) e raramente usaremos todos, utilizamos um tipo anônimo para informar os parâmetros “opcionais”. Assim não precisaremos encher a nossa classe com sobrecargas do método LinkTo.</p>
<p>Outro ganho que temos é na hora de adicionar mais um parâmetro ao método. Adicionamos no tipo anônimo e não precisamos alterar as chamadas na aplicação inteira. Mesmo com refactoring isso as vezes é problemático.</p>
<h3>Ok! Agora, como crio meu próprio método?</h3>
<p>Para ver como funciona vamos implementar um método que cria links, parecido com o que exemplifiquei antes. Primeiro veremos como fica o método – que vou chamar de “CriaLink” –, depois explico oque ele está fazendo:</p>
<p><script src="http://gist.github.com/111152.js"></script></p>
<p>Criei um extension method de nome <em>GetPropertyValue</em> na classe <em>Object</em> – para quem não sabe do que se trata extension methods <a href="http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/" target="_blank">falei sobre isso aqui</a>. Esse método busca o valor da propriedade de qualquer objeto passando apenas seu nome. Isso vai ser muito útil para tratar os tipos anônimos.</p>
<p>Já na implementação do método “CriaLink” primeiramente busco os valores das possíveis propriedades atribuídas ao tipo anônimo passado por parâmetro, que é do tipo Object porque não é possível prever um tipo anônimo. O método <em>GetPropertyValue</em> já se responsabiliza por saber se existe ou não a propriedade, no caso dela não existir o resultado é null.</p>
<p>Depois fica mais simples. Apenas criei uma StringBuilder para concatenar a tag de link que vou criar. Testo se as variáveis provenientes dos parametros possuem valores e concateno o valor relativo a cada propriedade.</p>
<p>Por ultimo mostro como podemos utilizar o método que criamos e o resultado obtido.</p>
<p>Já falei aqui o quanto sou fã da flexibilidade das linguagens de script. O C# tem incorporado algumas funcionalidades dessas linguagens e mesmo assim, ao contrário do que eu imaginava, consegue manter sua característica de ser fortemente tipado. Temos que aproveitar isso e tornar nosso código mais inteligente.</p>
<p>Espero que tenham gostado e qualquer duvida ou sugestão é só entrar em <a href="http://www.wagnerandrade.com/blog/contato/" target="_blank">contato</a> ou comentar aqui mesmo. Até mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/05/usando-tipos-anonimos-como-parametro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C# 3.0 Extension Methods</title>
		<link>http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 13:27:15 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extension Methods]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=23</guid>
		<description><![CDATA[Quando me propus a iniciar o blog, comentei que iria escrever sobre ASP.NET e Ruby. Nesses quase seis meses nunca escrevi um artigo se quer para a tecnologia do aposentado tio Bill, mas hoje vamos ao primeiro. Neste primeiro post sobre o .NET vou falar especificamente de C# e mais especificamente sobre uma nova funcionalidade [...]]]></description>
			<content:encoded><![CDATA[<p>Quando me propus a iniciar o blog, <a href="http://www.wagnerandrade.com/blog/2008/05/iniciando/">comentei</a> que iria escrever sobre ASP.NET e Ruby. Nesses quase seis meses nunca escrevi um artigo se quer para a tecnologia do aposentado tio Bill, mas hoje vamos ao primeiro. Neste primeiro post sobre o .NET vou falar especificamente de C# e mais especificamente sobre uma nova funcionalidade que veio com o C# 3.0, os Extension Methods.</p>
<p>Extension Methods é um recurso que quem costuma trabalhar em linguagens de script, como Ruby, já está mais acostumado. Consiste em &#8220;inserir&#8221; métodos em objetos já compilados, como uma string, por exemplo. Sim, esqueça a sua classe StringHelper ou StringUtil, agora os métodos utilitários que você sempre quis poderão ser inseridos diretamente na fonte.</p>
<p>Vamos à prática, primeiro vou mostrar como um extension é declarado, depois o exemplo de uso. Vou fazer um exemplo que não é tão útil, mas a intenção aqui é apenas mostrar a funcionalidade.</p>
<p>Imaginemos que temos URLs em formato de string na nossa aplicação e precisamos ter o conteúdo destas URLs. Vou criar um extension no objeto string que lê essa URL e retorna o seu conteúdo. Vamos à implementação:</p>
<p><script src="http://gist.github.com/27331.js"></script></p>
<p>Agora o exemplo de como utilizar o método que criei:</p>
<pre>string responseBody = "http://www.google.com".ReadUrl();</pre>
<p>É fácil criar um extension. Primeiro precisamos de uma classe e um método <em>static</em>. O método extension tem uma peculiaridade, o primeiro parâmetro possui a palavra chave <em>this </em>seguido pelo objeto no qual o extension será &#8220;inserido&#8221;. A partir deste parâmetro, os subsequentes serão efetivamente utilizados na chamada do método. Esse primeiro parâmetro é muito importante, perceba que ele representa a instancia do próprio objeto. No exemplo, a string responseBody vai ter o conteúdo HTML da página inicial do Google.</p>
<p>À primeira impressão parece uma implementação complicada, mas nada mais que alguns minutos serão necessários para se familiarizar com isso.</p>
<p>Eu sempre fui fã das linguagens mais dinâmicas, e nessa característica as linguagens de script são a Disney. Esse recurso adicionado ao C# 3.0 nos dá flexibilidade para criar métodos que vão organizar bastante o nosso código. Em breve coloco mais artigos sobre .NET.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/11/c-30-extension-methods/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
