我正在尝试编写一个简单的例程来处理ListView中的项目列表,并且只能处理所有项目或所选项目。我希望这可行:
private void PurgeListOfStudies(ListView.ListViewItemCollection lvic)
{
/// process items in the list...
}
然后像这样调用它:
PurgeListOfStudies(myStudiesPageCurrent.ListView.Items);
或者
PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedItems);
但是,这两个列表分别有不同且不相关的类型ListViewItemCollection
和SelectedListViewItemCollection
。
我尝试将参数类型更改为object
,ICollection<ListViewItem>
以及其他一些内容。但由于类型似乎完全不相关,所以在编译时或在演员表的运行时都会失败。
这一切对我来说都很奇怪,因为这些在现实中显然是同一类型(ListViewItem
s的列表。)
我在这里错过了什么吗?
答案 0 :(得分:5)
使用MSDN文档。
如您所见,这两个类都实现了接口:IList,ICollection和IEnumerable。您应该能够将其中任何一个用作通用接口。
注意这些是不通用版本(即IEnumerable&lt; T&gt;))。您必须枚举集合并手动将它们转换为所需的对象类型。
private void PurgeListOfStudies(IEnumerable items)
{
foreach(MyType currentItem in items) //implicit casting to desired type
{
// process current item in the list...
}
}
答案 1 :(得分:0)
如果你想让PurgeListOfStudies更安全一些类型,你可以让它采用类型为IEnumerable<ListViewItem>
的参数:
private void PurgeListOfStudies(IEnumerable<ListViewItem> items)
{
/// process items in the list...
}
并将其称为:
PurgeListOfStudies(myStudiesPageCurrent.ListView.Items.OfType<ListViewItem>());
或者这个:
PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedItems.OfType<ListViewItem>());
OfType<ListViewItem>()
扩展程序将非通用IEnumerable
转换为更安全的IEnumerable<ListViewItem>
。
编辑:
如果您因为必须明确调用OfType<ListViewItem>()
而烦恼,可以向ListView添加扩展方法:
static class ListViewExtensions
{
public static IEnumerable<ListViewItem> SelectedListViewItems(this ListView listView)
{
return listView.SelectedItems.OfType<ListViewItem>();
}
public static IEnumerable<ListViewItem> ListViewItems(this ListView listView)
{
return listView.Items.OfType<ListViewItem>();
}
}
然后致电
PurgeListOfStudies(myStudiesPageCurrent.ListView.ListViewItems());
或
PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedListViewItems());