Ho un ListView
in modalità virtuale e i dati sottostanti vengono memorizzati in un List<MyRowObject>
. Ogni colonna di ListView
corrisponde a una proprietà di stringa pubblica di MyRowObject
. Le colonne del mio ListView
sono configurabili durante il runtime, in modo tale che ognuna di esse possa essere disabilitata e possano essere riordinate. Per restituire un ListViewItem
per l'evento RetrieveVirtualItem
, ho un metodo simile a:C'è un modo carino per evitare l'uso di reflection per popolare il mio ListView virtuale?
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;
}
}
Il gestore di eventi per RetrieveVirtualItem
sembra simile a:
private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
e.Item = new ListViewItem(_virtualList[e.ItemIndex].GetItems(_currentColumns));
}
Forse non a caso, l'analisi comparativa dimostra che questo metodo è significativamente più lento di un'implementazione che accede alle proprietà direttamente in un ordine codificato, e il rallentamento è abbastanza significativo che mi piacerebbe trovare una soluzione migliore.
L'idea più promettente che ho avuto è di utilizzare un delegato anonimo per dire alla classe MyRowObject
come accedere direttamente alle proprietà, ma se è possibile non ho potuto ottenere la semantica giusta (dato il nome di una proprietà memorizzata in una stringa, c'è un modo in cui posso scrivere una chiusura per accedere direttamente a quella proprietà?).
Quindi, c'è un buon modo per evitare l'uso di reflection per popolare il mio ListView senza perdere alcuna funzionalità?
L'estensione open source di ListView è off-off a causa dei criteri aziendali.
che dire di switch/case? –
Le espressioni (specialmente su .net 4) potrebbero essere un modo semplice per implementare un delegato veloce che fa ciò che vuoi. – CodesInChaos