У меня есть ListView
в виртуальном режиме, а базовые данные хранятся в List
. Каждый столбец ListView
соответствует общедоступному строковому свойству MyRowObject
. Столбцы моего ListView
настраиваются во время выполнения, так что любой из них может быть отключен, и их можно переупорядочить. Чтобы вернуть ListViewItem
для события RetrieveVirtualItem
, у меня есть метод, похожий на:
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;
}
}
Обработчик событий для RetrieveVirtualItem
выглядит примерно так:
private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
e.Item = new ListViewItem(_virtualList[e.ItemIndex].GetItems(_currentColumns));
}
Возможно неудивительно, что сравнительный анализ показывает, что этот метод значительно медленнее, чем реализация, которая обращалась к свойствам напрямую в жестко заданном порядке, и замедление достаточно значительно, чтобы я хотел найти лучшее решение.
Самая многообещающая идея, которая у меня была, - использовать анонимного делегата, чтобы сообщить классу MyRowObject
, как получить прямой доступ к свойствам, но если это возможно, я не смог правильно понять семантику (учитывая имя свойства, хранящегося в строке, есть ли способ написать закрытие для прямого доступа к этому свойству?).
Итак, есть ли хороший способ избежать использования отражения для заполнения моего ListView без потери какой-либо функциональности?
Расширением ListView с открытым исходным кодом является вне лимита из-за политики компании.