0

我有一个序列化为 xaml 的对象图。它看起来的粗略示例是:

<MyObject xmlns.... >
    <MyObject.TheCollection>
        <PolymorphicObjectOne .../>
        <HiImPolymorphic ... />
    </MyObject.TheCollection>
</MyObject>

我想使用 Linq to XML 来提取 TheCollection 中的序列化对象。

注意MyObject可能在运行时命名不同;我对实现相同接口的任何对象感兴趣,它有一个名为的公共集合TheCollection,其中包含IPolymorphicLol.

我在运行时唯一知道的是我将找到集合的深度以及集合元素被命名为“*.TheCollection”。其他一切都会改变。

xml 将使用 Linq 从数据库中检索;如果我可以将这两个查询结合起来,而不是获取整个序列化图然后提取集合对象,我只会取回甜蜜的集合。

4

2 回答 2

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 框架来分析程序集中的类型,而不使用反射。

于 2008-09-05T13:47:36.037 回答
0

@aku
是的,我知道 xaml 不包含任何基本类型或接口的指示。但我在编译时确实知道根对象的接口,以及集合持有的接口。

序列化的图作为 XML 存储在 sql 数据库中,我们使用 linq 将它们作为 XElement 检索。目前,与您的解决方案一起,我们仅限于反序列化图形、遍历它们、从集合中提取我们想要的对象、从它们的父对象中删除对它们的所有引用,然后处理它们。这一切都非常笨拙。我希望有一个单冲程解决方案;类似于 xpath 的东西,但与我们的 linq to sql 查询内联,该查询仅返回我们正在寻找的元素......

于 2008-09-05T15:21:09.150 回答