Frage

Ich habe ein Objektdiagramm, das in XAML serialisiert ist.Ein grobes Beispiel dafür, wie es aussieht, ist:

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

Ich möchte Linq to XML verwenden, um die serialisierten Objekte innerhalb der TheCollection zu extrahieren.

Notiz: MyObject kann zur Laufzeit anders benannt werden;Ich interessiere mich für jedes Objekt, das dieselbe Schnittstelle implementiert und über eine öffentliche Sammlung namens verfügt TheCollection das enthält Arten von IPolymorphicLol.

Das Einzige, was ich zur Laufzeit weiß, ist die Tiefe, in der ich die Sammlung finden werde, und dass das Sammlungselement „*.TheCollection“ heißt.Alles andere wird sich ändern.

Die XML-Datei wird mithilfe von Linq aus einer Datenbank abgerufen.Wenn ich beide Abfragen kombinieren könnte, würde ich, anstatt das gesamte serialisierte Diagramm abzurufen und dann die Sammlungsobjekte zu extrahieren, einfach die Sammlung zurückbekommen, was süß wäre.

War es hilfreich?

Lösung

Wille,

Es ist nicht möglich, anhand von XAML herauszufinden, ob ein Objekt eine Schnittstelle implementiert.
Mit den angegebenen Einschränkungen können Sie XML-Elemente finden, die ein untergeordnetes Element namens haben.

Sie können folgenden Code verwenden:Es werden alle Elemente zurückgegeben, die ein untergeordnetes Element haben, dessen Name mit endet .Die Sammlung

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

Um sicherzustellen, dass das durch dieses Element dargestellte Objekt eine Schnittstelle implementiert, müssen Sie Metadaten aus Ihren Assemblys lesen.Ich würde Ihnen empfehlen, das Mono.Cecil-Framework zu verwenden, um Typen in Ihren Baugruppen ohne Reflexion zu analysieren.

Andere Tipps

@aku
Ja, ich weiß, dass XAML keinen Hinweis auf Basistypen oder Schnittstellen enthält.Aber ich kenne die Schnittstelle der Stammobjekte und die Schnittstelle, die die Sammlung zur Kompilierungszeit enthält.

Die serialisierten Diagramme werden in einer SQL-Datenbank als XML gespeichert und wir verwenden Linq, um sie als XElements abzurufen.Derzeit beschränken wir uns zusammen mit Ihrer Lösung darauf, die Diagramme zu deserialisieren, sie zu durchlaufen, die gewünschten Objekte aus der Sammlung herauszuziehen, alle Verweise auf sie aus ihren übergeordneten Objekten zu entfernen und diese dann zu entsorgen.Es ist alles sehr klobig.Ich hatte auf eine Lösung mit nur einem Schlag gehofft;Etwas in der Art eines XPath, aber inline mit unserer Linq-zu-SQL-Abfrage, die nur die Elemente zurückgibt, nach denen wir suchen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top