我有一个序列化为xaml的对象图。它的样子的粗略样本是:
<MyObject xmlns.... >
<MyObject.TheCollection>
<PolymorphicObjectOne .../>
<HiImPolymorphic ... />
</MyObject.TheCollection>
</MyObject>
我想使用Linq to XML来提取TheCollection中的序列化对象。
注意:MyObject
在运行时可能会有不同的名称;我对任何实现相同接口的对象感兴趣,该接口有一个名为TheCollection
的公共集合,其中包含IPolymorphicLol
的类型。
我在运行时唯一知道的是我将找到集合的深度,并且集合元素被命名为``* .TheCollection`。其他一切都会改变。
将使用Linq从数据库中检索xml;如果我可以将两个查询组合起来,而不是获取整个序列化图形,然后提取集合对象,我会收回那些很好的集合。
答案 0 :(得分:0)
威尔
通过查看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框架来分析程序集中的类型而不使用反射。
答案 1 :(得分:0)
@aku
是的,我知道xaml不包含任何基本类型或接口的指示。但我确实知道根对象的接口,以及集合在编译时保存的接口。
序列化图形作为XML存储在sql数据库中,我们使用linq将它们作为XElements检索。目前,与您的解决方案一起,我们仅限于反序列化图形,迭代它们,从集合中提取我们想要的对象,从中删除对它们的所有引用,然后处理它们的父项。这一切非常愚蠢。我希望有一个单冲程解决方案;沿着xpath的行,但与我们的linq到sql查询内联,返回我们正在寻找的元素......