Comment puis-je extraire une partie d'un code xaml de l'objet graphique via linq to xml?

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai un graphe d'objets sérialisés à xaml.Une rude échantillon de ce à quoi il ressemble:

<MyObject xmlns.... >
    <MyObject.TheCollection>
        <PolymorphicObjectOne .../>
        <HiImPolymorphic ... />
    </MyObject.TheCollection>
</MyObject>

Je veux utiliser Linq to XML afin d'en extraire les objets sérialisés dans le Lacollection.

Note: MyObject peuvent être nommés différemment lors de l'exécution;Je suis intéressé par un quelconque objet qui implémente l'interface même, qui a une collection publique appelée TheCollection qui contient les types de IPolymorphicLol.

Les seules choses que je sais au moment de l'exécution sont à la profondeur à laquelle je vais trouver de la collecte et de la collecte de l'élément nommé `*.Lacollection`.Tout le reste va changer.

Le xml va être récupéré à partir d'une base de données en utilisant Linq;si je pouvais combiner les deux requêtes ainsi, au lieu de réception de l'intégralité du sérialisé graphique et ensuite extraire les objets de collection, je voudrais juste revenir la collection qui soit doux.

Était-ce utile?

La solution

Va,

Il n'est pas possible de savoir si un objet implémente une interface en regardant le code XAML.
Avec les contraintes donné, vous pouvez trouver de l'élément xml qui a un enfant nommé .

Vous pouvez utiliser le code suivant:Il sera de retour tous les éléments ayant élément enfant dont le nom se termine avec .Lacollection

    static IEnumerable<XElement> FindElement(XElement root)
    {
        foreach (var element in root.Elements())
        {
            if (element.Name.LocalName.EndsWith(".TheCollection"))
            {
                yield return element.Parent;
            }
            foreach (var subElement in FindElement(element))
            {
                yield return subElement;
            }
        }
    }

Assurez-vous que l'objet représenté par cet élément implémente une interface, vous devez lire les métadonnées à partir de vos assemblées.Je vous recommande d'utiliser Mono.Cecil cadre d'analyse de types dans vos assemblées, sans l'aide de la réflexion.

Autres conseils

@aku
Oui, je sais que xaml ne comporte aucune indication de types de base ou des interfaces.Mais je sais que l'interface de la racine des objets, et l'interface que la collection contient, au moment de la compilation.

Le sérialisé graphiques sont stockées dans une base de données sql en XML, et nous sommes à l'aide de linq pour les récupérer comme XElements.Actuellement, le long de avec votre solution, nous sommes limités à la désérialisation les graphiques, le parcours à travers eux, à sortir les objets de la collection, en supprimant toutes les références à partir de, puis de l'élimination, de leurs parents.Son très encombrants.Je m'attendais à une course unique solution;quelque chose le long des lignes d'un xpath, mais en ligne avec notre linq to sql de la requête qui retourne uniquement les éléments que nous recherchons...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top