У меня есть граф объектов, сериализованный в 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 для анализа типов в ваших сборках без использования отражения.
@aku
Да, я знаю, что xaml не включает никаких указаний на базовые типы или интерфейсы. Но я знаю интерфейс корневых объектов и интерфейс, который содержит коллекция, во время компиляции.
Сериализованные графы хранятся в базе данных sql как XML, и мы используем linq для их получения как XElements. В настоящее время, наряду с вашим решением, мы ограничены десериализацией графов, их итерацией, извлечением нужных нам объектов из коллекции, удалением всех ссылок на них и последующим удалением их родителей. Все это очень неуклюже. Я надеялся на одноразовое решение; что-то вроде xpath, но встроенное в наш запрос linq to sql, который возвращает только те элементы, которые мы ищем ...