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)?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top