我有一个WinForms多选列表框,列表框中的每个项目都是MyClass
类型。
我也在编写一个需要采用MyClass
集合的参数的方法。它可以是MyClass[]
,List<MyClass>
,IList<MyClass>
,IEnumerable<MyClass>
等类型。其中任何一种都可以正常工作。
不知何故,我需要将列表框中的选定项目传递给我的方法。但是,如何将SelectedObjectCollection
转换为上述任何MyClass
集合类型?
答案 0 :(得分:5)
也许这会有所帮助:
IEnumerable<MyClass> items = yourListBox.SelectedItems.Cast<MyClass>();
答案 1 :(得分:2)
一个问题是ListBox
项不是通用列表,因此它可以包含多个类型。如果你呼叫.AsQueryable
,那么当你呼叫.Select()
时,你就会在非类型安全的集合上进行显式强制转换,与调用.Cast<T>
相同,因为你可以获得强制转换异常。更安全的方法是使用.OfType<T>()
IEnumerable<MyClass> selected = listBox.SelectedItems.OfType<MyClass>();
答案 2 :(得分:1)
您可以尝试Linq:
yourSelectedObjectCollection.AsQueryable().Select(o=>(MyClass)o).ToArray()
答案 3 :(得分:0)
我的TreeView遇到了同样的问题,它包含2个不同的类。
if(SelectedItem is MyClass)
{
MyClass passvariable = (MyClass)SelectedItem;
}
因此,如果您选择一个项目并且项目的类型是MyClass,则创建一个新变量并使用SelectedItem将其设置为MyClass类型。
您可以对Collection,List,...进行相同的操作。
if(MyList is ObservableCollection<MyClass>)
{
ObservableCollection<MyClass> passlist = (ObservableCollection<MyClass>)MyList;
}
如果在ListBox,ComboBox中有超过1个类,...只需使用if(... is type)
检查SelectedItem