Как я могу извлечь часть графа объекта xaml через linq to xml?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

Воля,

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

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

    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 для анализа типов в ваших сборках без использования отражения.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top