Как я могу извлечь часть графа объекта xaml через linq to xml?
-
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, который возвращает только те элементы, которые мы ищем...