我有一个虚拟模式下的ListView
,底层数据存储在List<MyRowObject>
中。 ListView
的每一列对应于MyRowObject
的公共字符串属性。我的ListView
的列可以在运行时进行配置,这样它们中的任何一个都可以被禁用,并且它们可以被重新排序。要返回ListViewItem
为RetrieveVirtualItem
事件,我也有类似的方法:有没有一种很好的方法来避免使用反射来填充我的虚拟ListView?
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的开放式源代码扩展名已关闭。
怎么样的switch/case? – 2010-11-03 22:19:49
表达式(尤其是在.net 4上)可能是一种简单的方法来实现一个快速的委托,完成你想要的任务。 – CodesInChaos 2010-11-03 22:46:56