我有一个序列化为 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 查询内联,该查询仅返回我们正在查找的元素...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top