Comment puis-je jeter dans un ObservableCollection

StackOverflow https://stackoverflow.com/questions/1198751

Question

Comment puis-je lancer

from ObservableCollection<TabItem> into ObservableCollection<object>

ce ne marche pas de travail pour moi

(ObservableCollection<object>)myTabItemObservableCollection
Était-ce utile?

La solution

vous devez copier comme ceci

return new ObservableCollection<object>(myTabItemObservableCollection);

Autres conseils

En fait, vous ne pouvez pas. Pas maintenant, et pas dans .NET 4.0 .

Quel est le contexte ici? De quoi avez-vous besoin? LINQ a Cast<T> qui peut vous obtenir les données comme séquence , ou il y a quelques trucs avec des méthodes génériques (c.-à-Foo<T>(ObservalbleCollection<T> col) etc).

Ou vous pouvez simplement utiliser le IList non générique?

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

vous pouvez utiliser IEnumerable.Cast<T>()

Vous ne pouvez pas. ObservableCollection<TabItem> ne dérive pas de ObservableCollection<object>.

Si vous expliquez pourquoi vous voulez peut-être que nous pouvons signaler une autre interface que vous pouvez utiliser.

Merci pour toutes les réponses, mais je pense que je dois résoudre ce problème avec une auto « helpermethode ».

a peut-être une meilleure méthode tout ou une déclaration LINQ pour cela.

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

Aucun des exemples que j'ai trouvé ont travaillé pour moi, j'ai bricolé le code ci-dessous et il semble fonctionner. J'ai une hiérarchie qui est créé par désérialisation un fichier XML et je suis en mesure de boucle à travers tous les objets de la hiérarchie, mais vous pouvez adapter ce à boucle juste par un ObservableCollection et d'obtenir les objets comme des objets et non fortement typé.

Je veux ajouter un PropertyChangingEventHandler à chaque propriété dans la hiérarchie afin que je puisse mettre en œuvre la fonctionnalité undo / redo.

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

La méthode est simplement appelé comme ceci

TraversalHelper.TraverseAndExecute(object);

Si vous voulez juste créer une collection d'objets que vous avez juste besoin de ce morceau de 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
}

Vous pouvez lancer comme INotifyCollectionChanged;

Comme:

if (myTabItemObservableCollection is INotifyCollectionChanged collection)
{
   Do Stuff
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top