如何通过 linq to xml 提取 xaml 对象图的一部分?
-
09-06-2019 - |
题
我有一个序列化为 xaml 的对象图。其外观的粗略示例如下:
<MyObject xmlns.... >
<MyObject.TheCollection>
<PolymorphicObjectOne .../>
<HiImPolymorphic ... />
</MyObject.TheCollection>
</MyObject>
我想使用 Linq to XML 来提取 TheCollection 中的序列化对象。
笔记: MyObject
在运行时可能有不同的命名;我对实现相同接口的任何对象感兴趣,该对象有一个名为的公共集合 TheCollection
其中包含类型 IPolymorphicLol
.
我在运行时唯一知道的是我将找到集合的深度以及集合元素名为“*.TheCollection”。其他一切都会改变。
将使用 Linq 从数据库中检索 xml;如果我可以组合两个查询,那么我将只取回集合,而不是获取整个序列化图,然后提取集合对象,这将是很好的。
解决方案
将要,
通过查看 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 框架来分析程序集中的类型,而不使用反射。
其他提示
@aku
是的,我知道 xaml 不包含任何基本类型或接口的指示。但我确实知道根对象的接口,以及编译时集合所持有的接口。
序列化图以 XML 形式存储在 SQL 数据库中,我们使用 linq 将它们作为 XElement 进行检索。目前,与您的解决方案一起,我们仅限于反序列化图表,迭代它们,从集合中取出我们想要的对象,删除对它们的所有引用,然后处理它们的父对象。这一切都非常糟糕。我希望有一个单一的解决方案;类似于 xpath 的东西,但与我们的 linq to sql 查询内联,该查询仅返回我们正在查找的元素...