2009-07-29 8 views
11

Wie ich für mich werfen kannWie kann ich in ein ObservableCollection werfen <object>

from ObservableCollection<TabItem> into ObservableCollection<object> 

dies nicht funktioniert

(ObservableCollection<object>)myTabItemObservableCollection 
+2

Das Kovarianz genannt wird, und es ist noch nicht verfügbar in C# –

+1

(und für Sammlungen, wird auch nicht in 4.0 verfügbar sein - nur um klar zu sein) –

Antwort

12

Sie dieses

return new ObservableCollection<object>(myTabItemObservableCollection); 
+0

Sie haben das 'neue' Schlüsselwort vergessen –

+0

danke Dr Ich habe es hinzugefügt –

+1

. NET 4 löst dieses Problem nicht wie in Marc Gravells Beitrag beschrieben. – MrSlippers

0

Sie können nicht. ObservableCollection<TabItem> stammt nicht von ObservableCollection<object>.

Wenn Sie erklären, warum Sie vielleicht möchten, können wir vielleicht eine alternative Schnittstelle aufzeigen, die Sie verwenden können.

11

Grundsätzlich kopieren sollten, können Sie nicht. Nicht jetzt und not in .NET 4.0.

Was ist der Kontext hier? Was brauchst du? LINQ hat Cast<T>, die Sie die Daten als Sequenz erhalten können, oder es gibt einige Tricks mit generischen Methoden (d. H. Foo<T>(ObservalbleCollection<T> col) usw.).

Oder Sie können einfach die nicht-generische IList verwenden?

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

Sie IEnumerable.Cast<T>()

0

Danke für alle Antworten verwenden könnte, aber ich denke, dass ich dieses Problem selbst mit einem „helpermethode“ lösen haben.

Vielleicht hat eine bessere Methode oder eine linq-Anweisung dafür.

+0

Da wir nicht wissen, was ObjectCollection als getippt ist, ist das ziemlich schwer zu beantworten ... –

+0

Ich verstehe nicht, was du meinst ?! Ich habe ein TabItem, was ich in eine ObservableCollection vom Typ Objekt hinzufügen möchte. "Manager" ist eine globale Klassen mit einer ObservableCollection was ich brauche in jeder Ansichten/Komponenten in meiner Prisma-Anwendung. –

+0

Ah sorry ich habe deine Antwort missverstanden. "ObjectCollection" ist als Objekt ObservableCollection

0

Keines der Beispiele, die ich gefunden habe, hat für mich funktioniert, ich habe den untenstehenden Code zusammengeschustert und es scheint zu funktionieren. Ich habe eine Hierarchie, die durch Deserialisierung einer XML-Datei erstellt wird, und ich bin in der Lage, alle Objekte in der Hierarchie durchzulaufen, aber Sie können dies anpassen, um nur eine ObservableCollection durchzulaufen und die Objekte als Objekte und nicht stark typisiert zu erhalten.

Ich möchte einen PropertyChangingEventHandler zu jeder Eigenschaft in der Hierarchie hinzufügen, so dass ich Rückgängig/Redo-Funktionalität implementieren kann.

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 
        } 
       } 
      } 
     } 
    } 
} 

Das Verfahren ist genau wie diese Wenn Sie nur einfach eine Sammlung von Objekten erstellen möchten

TraversalHelper.TraverseAndExecute(object); 

genannt Sie dieses Stück Code benötigen

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 
} 
Verwandte Themen