quinta-feira, 28 de maio de 2009

Retornando um objeto via LINQ, mas setando propriedades sem criar um novo objeto

Normalmente, com a sintaxe declarativa do Linq:


var valor = from obj in listaobjects
select obj;

Este exemplo acima retorna os itens da listaobjects, sem alterar nenhuma propriedade.

Agora, digamos que se quisesse setar a propriedade Nome do objeto, antes de retornar.

Via sintaxe em Extension Methods:

var valor = listaObjects.Select(x => x.Nome = "teste"; return x;};

Na sintaxe declarativa, pode-se fazê-lo via a (horrorosa) instrução abaixo:

var valor = from obj in listaObjects
select new itemRetorno{ Nome = "Teste", Endereco = obj.Endereco, ...};

Mas uma saída bem mais elegante seria a criação de um Extension Method baseado em um delegate, como o exemplo abaixo:


namespace System.Linq
{

public static class ExtensaoLinq
{
public delegate void Atualiza(T updater);
public static T Set(this T input, Atualiza atualizador)
{
atualizador(input);
return input;
}
}
}


Então, com isto, podemos escrever em sintaxe declarativa:

var valor = from obj in listaObjects
select obj.Set(obj => { obj.Nome = "Teste"; });