Novas funcionalidades são sempre bem vindas, mas as novidades sempre trazem mais novidades, situações, problemas, enfim, o trivial.
Os tipos anônimos do C# 3.0 economizam um bocado de tempo quando se precisa extrair algo de uma lista baseada em uma query LINQ. Vou dar um exemplo para elucidar a situação. Quando você extrai de uma determinada lista apenas alguns campos, por exemplo, do objeto:
public class Pessoa { public string Nome { get; set; } public string SobreNome{ get; set; } public string Curso { get; set; } public string Escola { get; set; } } |
E queremos tirar uma lista única de Curso/Escola. Fácil, é só usar o Distinct, gerando algo como:
(from p in PessoaList select new { p.Curso, p.Escola }).Distinct(); |
Mais fácil ainda se atribuir o resultado do código acima direto ao DataSource de um Repeater ou GridView. Mas, como fazer para coletar os valores e fazer o bind e um tipo que não existe, por exemplo, no evento ItemDataBound ou RowDataBound? Se você ativar o Watcher sobre o e.Item.DataItem, você verá um tipo anônimo referenciado de uma forma um pouco estranho. Se tentar usar no código, não funciona.
Como resolver? Não tem jeito: Reflection!
Se você tiver certeza de que a propriedade existe, dá para fazer uma referência direta:
e.Item.GetType().GetProperty("Escola").GetValue(e.Item, null) |
Se houver dúvida quanto a existência, algumas verificações precisarão ser feitas. Deixo abaixo do código do colega leppie do StackOverFlow que faz tais verificações:
object o = e.Row.DataItem; Type t = o.GetType(); PropertyInfo pi = t.GetProperty("StringProperty"); if (pi != null && pi.PropertyType == typeof(string)) { // the property exists! string s = pi.GetValue(o, null) as string; // we have the value // insert your code here // PROFIT! :) } |
Bom proveito!
Referências:
http://stackoverflow.com/questions/607433/net-databinding-referencing-anonymous-type-properties