[ACCEPTED]-How can i cast into a ObservableCollection<object>-covariance
you should copy like this
return new ObservableCollection<object>(myTabItemObservableCollection);
0
Basically, you can't. Not now, and not in .NET 4.0.
What 5 is the context here? What do you need? LINQ 4 has Cast<T>
which can get you the data as a sequence, or 3 there are some tricks with generic methods 2 (i.e. Foo<T>(ObservalbleCollection<T> col)
etc).
Or you can just use the non-generic 1 IList
?
IList untyped = myTypedCollection;
untyped.Add(someRandomObject); // hope it works...
you could use IEnumerable.Cast<T>()
0
You can't. ObservableCollection<TabItem>
does not derive from ObservableCollection<object>
.
If you 3 explain why you would want to perhaps we 2 can point out an alternative interface you 1 can use.
thanx for all answers, but I think I have 3 solve this problem self with a "helpermethode".
Perhaps 2 has any a better method or a linq statement 1 for this.
private void ConvertTabItemObservableCollection()
{
Manager manager = this.container.Resolve<Manager>();
foreach (var tabItem in manager.ObjectCollection)
{
TabItemObservableCollection.Add((TabItem)tabItem);
}
}
None of the examples I have found have worked 13 for me, I have cobbled together the below 12 code and it seems to work. I have a hierarchy 11 that is created by deserializing an XML 10 file and I am able to loop through all the 9 objects in the hierarchy, but you can adapt 8 this to just loop through one ObservableCollection 7 and get the objects as objects and not strongly 6 typed.
I want to add a PropertyChangingEventHandler 5 to every property in the hierarchy so that 4 I can implement undo/redo functionality.
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
}
}
}
}
}
}
The 3 method is just called like this
TraversalHelper.TraverseAndExecute(object);
If you just 2 want to create a collection of objects you 1 just need this bit of code
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
}
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.