我在C#中有一个ObservableCollection对象。该对象实现了一个接口。我希望能够将对象的ObservableCollection转换为接口的ObservableCollection,而无需解析集合。
例如:
我有一个“吉他”对象,它实现了一个名为“IMusicalInstrument”的界面。我将一个ObservableCollection的Guitar对象绑定到MyListBox。我希望以下代码行能够将listbox itemsSource转换为ObservableCollection。
ObservableCollection<IMusicalInstrument> InstrumentList =
(ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource;
目前,这给了我一个InvalidCastException。
有没有办法实现这一点(无需解析整个集合)?
谢谢, 塞特
答案 0 :(得分:2)
你无法施放它,但是一种方法是包装你知道你想要避免的迭代,但不幸的是不能进入extension method。
public static class CollectionExtensions
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerableList)
{
if (enumerableList != null)
{
//create an emtpy observable collection object
var observableCollection = new ObservableCollection<T>();
//loop through all the records and add to observable collection object
foreach (var item in enumerableList)
observableCollection.Add(item);
//return the populated observable collection
return observableCollection;
}
return null;
}
}
这可以让你做类似的事情......
ObservableCollection<IMusicalInstrument> InstrumentList = MyListBox.ItemsSource.ToObservableCollection<IMusicalInstrument>();
......这就是我相信你所追求的。
您也可以简单地将IEnumerable<T>
引用传递给ObservableCollection<T>
的构造函数...
ObservableCollection<IMusicalInstrument> InstrumentList = new ObservableCollection<IMusicalInstrument>(MyListBox.ItemsSource);
答案 1 :(得分:1)
除非MyListBox.ItemsSource
是ObservableCollection<IMusicalInstrument>
的实例,否则你不能投出它。
答案 2 :(得分:1)
抱歉,您无法执行此操作,因为ObservableCollection<Guitar>
不能视为ObservableCollection<IMusicalInstrument>
- 例如你不能打电话给collection.Add(new Flute())
。
答案 3 :(得分:0)
如果您只想管理集合的项目,那么您可以尝试将ItemsSource转换为非通用IList。
答案 4 :(得分:0)
如果您只是使用ObservableCollection处理集合已更改事件,则可以转换为INotifyCollectionChanged并添加事件处理程序。 INotifyCollectionChanged不使用泛型,因此无论如何都必须在事件处理程序中进行转换。
但是,如果要枚举IMusicalInstrument实例的集合,可以使用Linq Cast()扩展方法。 e.g。
IEnumerable<IMusicalInstrument> instruments =
((IEnumerable)MyListBox.ItemsSource).Cast<IMusicalInstrument>();
希望有所帮助!