У меня есть ListView
в виртуальном режиме, а основные данные хранятся в List<MyRowObject>
.Каждый столбец 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 с открытым исходным кодом отключено из-за политики компании.