如何转换为ObservableCollection

我怎么能投

from ObservableCollection into ObservableCollection 

这不适合我

 (ObservableCollection)myTabItemObservableCollection 

你应该像这样复制

 return new ObservableCollection(myTabItemObservableCollection); 

基本上,你不能。 不是现在,而不是在.NET 4.0中 。

这里的背景是什么? 你需要什么? LINQ具有Cast ,它可以将数据作为序列获取 ,或者有一些通用方法的技巧(即Foo(ObservalbleCollection col)等)。

或者您可以使用非通用IList

 IList untyped = myTypedCollection; untyped.Add(someRandomObject); // hope it works... 

你可以使用IEnumerable.Cast()

你不能。 ObservableCollection不是从ObservableCollection派生的。

如果你解释为什么你想要,或许我们可以指出你可以使用的替代界面。

感谢所有答案,但我认为我用“helpermethode”解决了这个问题。

也许有更好的方法或linq声明。

 private void ConvertTabItemObservableCollection() { Manager manager = this.container.Resolve(); foreach (var tabItem in manager.ObjectCollection) { TabItemObservableCollection.Add((TabItem)tabItem); } } 

我找到的所有例子都没有为我工作,我拼凑了下面的代码,它似乎工作。 我有一个通过反序列化XML文件创建的层次结构,我能够循环遍历层次结构中的所有对象,但是您可以将其调整为仅循环一个ObservableCollection并将对象作为对象而不是强类型。

我想为层次结构中的每个属性添加一个PropertyChangingEventHandler,以便我可以实现撤消/重做function。

 public static class TraversalHelper { public static void TraverseAndExecute(object node) { TraverseAndExecute(node, 0); } public static void TraverseAndExecute(object node, int level) { foreach (var property in node.GetType().GetProperties()) { var propertyValue = node.GetType().GetProperty(property.Name).GetGetMethod().Invoke(node, null); // Get the value of the property if (null != propertyValue) { Console.WriteLine("Level=" + level + " : " + property.Name + " :: " + propertyValue.GetType().Name); // For debugging if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(ObservableCollection<>)) // Check if we are dealing with an observable collection { //var dummyvar = propertyValue.GetType().GetMethods(); // This was just used to see which methods I could find on the Collection Int32 propertyValueCount = (Int32)propertyValue.GetType().GetMethod("get_Count").Invoke(propertyValue, null); // How many objects in the collection level++; for (int i = 0; i < propertyValueCount; i++) // Loop over all objects in the Collection { object properyValueObject = (object)propertyValue.GetType().GetMethod("get_Item").Invoke(propertyValue, new object[] { i }); // Get the specified object out of the Collection TraverseAndExecute(properyValueObject, level); // Recursive call in case this object is a Collection too } } } } } } 

这个方法就是这样调用的

 TraversalHelper.TraverseAndExecute(object); 

如果你只想创建一个对象集合,你只需要这些代码

 ObservableCollection typedField = migration.FileDescriptions[0].Inbound[0].Tables[0].Table[0].Fields[0].Field; // This is the strongly typed decalaration, a collection of Field objects object myObject = typedField; // Declare as object Int32 propertyValueCount = (Int32)myObject.GetType().GetMethod("get_Count").Invoke(myObject, null); // How many objects in this Collection for (int i = 0; i < propertyValueCount; i++) // Loop over all objects in the Collection { object properyValueObject = (object)myObject.GetType().GetMethod("get_Item").Invoke(myObject, new object[] { i }); // Get the specified object out of the Collection, in this case a Field object // Add the object to a collection of objects, or whatever you want to do with object }