Pregunta

He enlazado un ASP.net GridView a una colección de tipos anónimos.

¿Cómo puedo hacer referencia a una de las propiedades de los tipos anónimos en el controlador de eventos RowDataBound?

Ya soy consciente de la forma de emitir el tipo anónimo de esta manera:

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;
}

Creo que la mayoría diría que esto es desordenado, aunque funciona. En mi código real, tengo más de 3 propiedades y tendría que actualizar el código en dos lugares cada vez que agregué o reordené las propiedades de mi tipo anónimo.

¿Hay una mejor manera de decirle a e.Row.DataItem que tiene una propiedad específica de un tipo específico y obliga al objeto a darme ese valor (además de crear una clase)?

¿Fue útil?

Solución

La forma en que lo usas (emitir por ejemplo) es confusa y muy frágil. Realmente no lo recomiendo (si agregas una propiedad o los nombras en un orden diferente, se romperá, etc). El mejor enfoque es utilizar su propio tipo con nombre en la proyección.

Otros consejos

Observa el uso de la reflexión.

Ejemplo:

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

La comprobación de errores y la optimización quedan como un ejercicio para el lector.

Una mejor manera sería crear un tipo para manejar esto, de modo que no tenga que hacer todo el casting para usar el tipo anónimo.

Lo que hago es ... por ejemplo,

string Name = (string)DataBinder.Eval(dataItem.DataItem, "Name");

... pero esto está en un controlador de eventos ItemDataBound . Pensé que podría ser útil para alguien.

No, no creo que haya mejor manera que esta. Los chicos de C # realmente no admiten el uso de tipos anónimos fuera del alcance del método local (es decir, aquí tiene un tipo anónimo adjunto a su objeto Fila).

La sugerencia habitual sería hacer una clase real en su lugar.

El método que estás usando para lanzar el objeto anónimo (aunque muy bueno) es un hack. Funciona simplemente porque el compilador de C # es lo suficientemente inteligente como para crear solo una instancia de la Clase Anónima para toda la aplicación si las Propiedades son las mismas. Así que realmente no hay beneficio en el uso de tipos anónimos, ya que de todos modos se está creando una clase detrás de escena. Sí, puedes hackearlo, puedes usar la reflexión, pero seriosuly, ¿para qué molestarse? ¿Qué beneficio tiene utilizar tipos anónimos en este caso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top