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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
334
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Будем,

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

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

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

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