Есть хороший способ чтобы избежать использования отражения для заполнения моего виртуального ListView?

У меня есть 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 с открытым исходным кодом является вне лимита из-за политики компании.

5
задан jtabak 3 November 2010 в 22:02
поделиться