.net Databinding - Referenciamento Anonymous Propriedades de tipo
-
03-07-2019 - |
Pergunta
Eu tenho ligado um ASP.net GridView a uma coleção de tipos anônimos.
Como posso referenciar uma das propriedades dos tipos anônimos no manipulador de eventos RowDataBound?
Eu já estou ciente da maneira de lançar o tipo anônimo como esta:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var AnonObj = Cast(e.Row.DataItem,
new { StringProperty = "", BoolProperty = false, IntProperty = 0 });
if (AnonObj.BoolProperty)
{
e.Row.Style.Add(HtmlTextWriterStyle.Color, "Red");
}
}
}
T Cast<T>(object obj, T type)
{
return (T)obj;
}
Eu acho que a maioria diria que este é confuso, mesmo que ela não funciona. No meu código real, eu tenho mais de 3 propriedades e eu teria de código de atualização em dois lugares a qualquer hora I adicionado ou reordenadas as propriedades do meu tipo anônimo.
Existe uma maneira melhor de dizer e.Row.DataItem que tem uma propriedade específica de um tipo específico e forçar o objeto para me dar esse valor (além de criar uma classe)?
Solução
A maneira como você está usando (elenco por exemplo) é confuso e muito quebradiços - I realmente não recomendo (se você adicionar uma propriedade, ou nomeá-los em uma ordem diferente, ele vai quebrar; etc). A melhor abordagem é usar o seu próprio tipo chamado na projeção.
Outras dicas
olhar em usar reflexão.
Exemplo:
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! :)
}
Erro de verificação e otimização deixado como um exercício para o leitor.
A melhor maneira seria criar um tipo de lidar com isso para que você não tem que fazer tudo o que lançando para usar o tipo anônimo.
O que faço é ... por exemplo,
string Name = (string)DataBinder.Eval(dataItem.DataItem, "Name");
... mas isso é em um manipulador de eventos listview ItemDataBound
. Pensei que poderia ser útil para alguém.
Não, eu não acredito que há alguma maneira melhor do que este. Os C # caras realmente não suporta a utilização de tipos anônimos fora do escopo do método local (ou seja, aqui você tem um tipo anônimo ligado ao seu objeto Row.)
A sugestão usual seria fazer uma classe real em vez.
O método que você está usando para converter o objeto anônimo (enquanto muito legal) é um hack. Ele funciona simplesmente porque o compilador C # é inteligente o suficiente para criar apenas uma instância da classe anônima para todo o aplicativo se as propriedades são as mesmas. Então, realmente não há nenhuma vantagem em usar tipos anônimos, uma vez que a classe está sendo criado nos bastidores de qualquer maneira. Sim, você pode cortá-lo, você pode usar a reflexão, mas seriosuly, por que se preocupar? Qual o benefício está lá para usar tipos anônimos neste caso?