Postado em
Monday, March 29, 2010 9:19 PM
Você sabe o que é Duck Typing? Duke Typing é um processo para definir tipos, métodos e operadores em tempo de execução. Se você tem um objeto que anda como um pato, faz quack como um pato logo é um pato.
O C# 4.0 trouxe esse recurso na forma de Dynamic Binding. Esse recurso é útil quando sabemos que um método ou operador existem no tipo mas estaticamente o compilador não tem condições de saber. Basicamente a palavra reservada dynamic diz ao compilador para ficar sossegado que em tempo de execução ele saberá o que fazer.
Vamos entender um pouco sobre as diferenças entre Static Binding e Dynamic Binding.
Conheceremos melhor o que é um e o que é outro brincando com a seguinte classe:
class ClassXYZ
{
public void Foo(int id)
{
Console.WriteLine("Persist.Foo");
}
}
Vamos supor que queremos instanciar um objeto do tipo ClassXYZ e chamar o método Foo(int). No C# atual nós temos algumas opções, vejamos:
ClassXYZ staticObj = new ClassXYZ();
staticObj.Foo(42);
O código acima instância um objeto ClassXYZ e chama o método Foo, em tempo de compilação o conhecemos exatamente de que tipos estamos falando.
Nós também podemos chamar o método Foo de uma outra forma. Podemos usar reflection para criar um objeto ClassXYZ depois pegamos o método Foo e invocamos o método passando o argumento 42.
Vejam só como ficaria o método.
object reflectionObj = Activator.CreateInstance(Type.GetType("ConsoleApplication1.ClassXYZ"));
MethodInfo method = reflectionObj.GetType().GetMethod("Foo");
method.Invoke(reflectionObj, new object[] { 42 });
Poxa vida! Agora você complicou hein! Reflection é uma técnica avançada e é bastante utilizada em frameworks de persistência (conheça o Paulovich.Data no Codeplex).
Isso é Static Binding, você precisa explicitar para o compilador exatamente quais são os tipos sendo usados.
Já com o C# 4.0 nós temos um recurso bastante valioso chamado Dynamic Binding. Com ele nós podemos ter um código semelhante a isso:
dynamic obj = GetObject();
obj.Foo(42);
Onde GetObject fica encarregado de em tempo de execução definir qual o tipo sendo usado. Com a palavra reservada dynamic nós limpanos o nosso código de Reflections mirabolantes e passamos a ter um código mais legível.
É importantíssimo ressaltar que esse recurso não veio para substituir a forma convencional como declaramos os tipos e chamamos os métodos. Essa nova característica da linguagem veio para atender aos programadores que precisavam fazer malabarismo para realizar determinadas operações.