我如何施展
from ObservableCollection<TabItem> into ObservableCollection<object>
这对我不起作用
(ObservableCollection<object>)myTabItemObservableCollection
答案 0 :(得分:12)
你应该像这样复制
return new ObservableCollection<object>(myTabItemObservableCollection);
答案 1 :(得分:12)
基本上,你不能。不是现在,not in .NET 4.0。
这里的背景是什么?你需要什么? LINQ有Cast<T>
可以将数据作为序列获取,或者有一些通用方法的技巧(即Foo<T>(ObservalbleCollection<T> col)
等)。
或者您可以使用非通用IList
?
IList untyped = myTypedCollection;
untyped.Add(someRandomObject); // hope it works...
答案 2 :(得分:4)
您可以使用IEnumerable.Cast<T>()
答案 3 :(得分:0)
你做不到。 ObservableCollection<TabItem>
并非来自ObservableCollection<object>
。
如果你解释为什么你想要,或许我们可以指出你可以使用的替代界面。
答案 4 :(得分:0)
感谢所有答案,但我想我已经用“helpermethode”解决了这个问题。
也许有更好的方法或linq声明。
private void ConvertTabItemObservableCollection()
{
Manager manager = this.container.Resolve<Manager>();
foreach (var tabItem in manager.ObjectCollection)
{
TabItemObservableCollection.Add((TabItem)tabItem);
}
}
答案 5 :(得分:0)
我找到的所有示例都没有为我工作,我拼凑了下面的代码,它似乎工作。我有一个通过反序列化XML文件创建的层次结构,我能够循环遍历层次结构中的所有对象,但是您可以将其调整为仅循环通过一个ObservableCollection并将对象作为对象而不是强类型。
我想为层次结构中的每个属性添加一个PropertyChangingEventHandler,以便我可以实现撤消/重做功能。
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<Field> 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
}
答案 6 :(得分:0)
您可以将其强制转换为INotifyCollectionChanged;
赞:
if (myTabItemObservableCollection is INotifyCollectionChanged collection)
{
Do Stuff
}