【发布时间】:2009-10-28 15:50:19
【问题描述】:
鉴于以下 XML 示例,我们可以想象一个模式将 Root 定义为包含 Type1 和 Type2 之间的一系列无限制选择。
<Root>
<Type1 />
<Type2 />
<Type2 />
<Type1 />
</Root>
我正在测试从 XSD.exe 工具迁移,虽然它增加了类型安全,但有很多小烦恼。在这种情况下,XSD 工具只是在 Root 中创建一个 System.Object 类型的数组,您必须弄清楚其中的对象类型(Type1 或 Type2)。它并不完全优雅,但至少你保持秩序。
问题是当 LINQ to XSD 创建对象时,它将 Root 定义为具有两个独立的 Type1 和 Type2 列表。这很好,因为它是类型安全的,但我现在似乎失去了元素的顺序。我从 codeplex 上的源代码构建了 LINQ to XSD。
使用 LINQ to XSD,如何保持这些元素的顺序?
【问题讨论】:
-
好吧,您已经提出了仅有的两个选项。要么你得到一个保留顺序的弱类型集合,要么你得到每个类型的强类型集合。假设您根本不使用任何 XML - 您将如何编写一个纯代码对象,其中包含一个具有多种类型的强类型集合?
-
我的问题是如何使用 Linq to XSD 在这种情况下保留元素的顺序。我意识到有一个混合类型的集合,它们需要是 System.Object (或它们共有的任何父级)。在这种情况下,我愿意放弃强类型对象,W/Linq to XSD 以保持顺序。我希望有一种方法可以强迫它这样做。在我的用例中,顺序很重要,所以我不能使用 Linq to XSD,尽管我真的很想使用它,因为它比 XSD.exe 有很多优势
-
你可以通过继承来做到这一点。如果 Type1 和 Type2 都有一个公共基类,则可以有一个 IList
。现在你有一个单一的强类型列表,并且顺序被保留了。遍历列表时,只需检查当前对象的类型。 foreach(BaseType el in elements) { if (el is Type1) ... else if (el is Type2) ... } -
小猪退出其他 cmets,看起来您回答了自己的问题。要获得订单,您必须使用某种基类,无论是对象还是您创建的对象,并在运行时进行类型检查。我建议你添加一个答案然后接受它。 :-) 如果我没记错的话,你会得到一个徽章。
标签: c# linq xsd xsd.exe linq-to-xsd