Tengo un ListView
en modo virtual, y los datos subyacentes se almacenan en un List<MyRowObject>
. Cada columna del ListView
corresponde a una propiedad de cadena pública de MyRowObject
. Las columnas de mi ListView
son configurables durante el tiempo de ejecución, de modo que cualquiera de ellas se puede deshabilitar y se pueden reordenar. Para devolver una ListViewItem
para el evento RetrieveVirtualItem
, tengo un método similar a:¿Existe alguna manera de evitar el uso de la reflexión para poblar mi ListView virtual?
class MyRowObject
{
public string[] GetItems(List<PropertyInfo> properties)
{
string[] arr = new string[properties.Count];
foreach(PropertyInfo property in properties)
{
arr[i] = (string)property.GetValue(this,null);
}
return arr;
}
}
El controlador de eventos para RetrieveVirtualItem
una apariencia similar a:
private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
e.Item = new ListViewItem(_virtualList[e.ItemIndex].GetItems(_currentColumns));
}
Tal como era de esperar, la evaluación comparativa muestra que este método es significativamente más lento que una implementación que accede a las propiedades directamente en un orden codificado, y la desaceleración es lo suficientemente significativa como para que me gustaría encontrar una mejor solución.
La idea más prometedora que he tenido es utilizar un delegado anónimo para indicar a la clase MyRowObject
cómo acceder directamente a las propiedades, pero si es posible no pude obtener la semántica correcta (dado el nombre de una propiedad almacenada en una cadena, ¿hay alguna manera de escribir un cierre para acceder directamente a esa propiedad?).
Entonces, ¿hay alguna manera de evitar el uso de la reflexión para llenar mi ListView sin perder ninguna funcionalidad?
La extensión de código abierto de ListView está fuera de límite debido a la política de la compañía.
¿qué pasa con switch/case? –
Expresiones (especialmente en .net 4) podría ser una manera fácil de implementar un delegado rápido haciendo lo que desee. – CodesInChaos