C# 4.0 - Dynamic Binding

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.

Comentários


Nenhum comentário enviado ainda.

Enviar Comentário





Please add 3 and 8 and type the answer here: