Как я могу извлечь часть графа объекта xaml через linq to xml? - PullRequest
0 голосов
/ 05 сентября 2008

У меня есть граф объектов, сериализованный в xaml. Примерный пример того, как это выглядит:

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

Я хочу использовать Linq to XML для извлечения сериализованных объектов в коллекции TheCollection.

Примечание : MyObject может именоваться по-разному во время выполнения; Меня интересует любой объект, который реализует тот же интерфейс, который имеет общедоступную коллекцию с именем TheCollection, которая содержит типы IPolymorphicLol.

Единственное, что я знаю во время выполнения, - это глубина, на которой я найду коллекцию, и что элемент коллекции называется `` * .TheCollection`. Все остальное изменится.

xml будет извлечен из базы данных с использованием Linq; если бы я мог объединить оба запроса, вместо того чтобы получить весь сериализованный граф и затем извлечь объекты коллекции, я бы просто получил коллекцию, которая была бы приятной.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2008

@ Ака
Да, я знаю, что xaml не содержит никаких указаний на базовые типы или интерфейсы. Но я знаю интерфейс корневых объектов и интерфейс, который содержит коллекция во время компиляции.

Сериализованные графики хранятся в базе данных sql в виде XML, и мы используем linq для извлечения их как XElements. В настоящее время, наряду с вашим решением, мы ограничены десериализацией графиков, итерацией по ним, извлечением нужных нам объектов из коллекции, удалением всех ссылок на них и последующим удалением их родителей. Это все очень грязно. Я надеялся на одноразовое решение; что-то вроде xpath, но в соответствии с нашим запросом linq to sql, который возвращает только элементы, которые мы ищем ...

0 голосов
/ 05 сентября 2008

Will

Невозможно выяснить, реализует ли объект какой-либо интерфейс, посмотрев на XAML.
С учетом указанных ограничений вы можете найти элемент xml, у которого есть дочерний элемент.

Вы можете использовать следующий код: Он вернет все элементы, имеющие дочерний элемент, имя которого заканчивается на .TheCollection

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

Чтобы убедиться, что объект, представленный этим элементом, реализует некоторый интерфейс, вам необходимо прочитать метаданные из ваших сборок. Я бы порекомендовал вам использовать инфраструктуру Mono.Cecil для анализа типов в ваших сборках без использования отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...