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; }
} |
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(); |
(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) |
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! :)
} |
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