Учитывая следующий пример XML мы могли вообразить схему, определяющую Корень как содержащий последовательность несвязанного количества выбора между Type1 и Type2.
<Root>
<Type1 />
<Type2 />
<Type2 />
<Type1 />
</Root>
Я проверяю миграцию от инструмента XSD.exe, который, хотя добавляет, безопасность типов имеет много небольших раздражений. Инструмент XSD в этом случае просто создает в Корне массив системы типов. Объект и Вы должны выяснить, какие объекты (Type1 или Type2) там. Не абсолютно изящный, но по крайней мере Вы сохраняете порядок.
Проблема состоит в том, когда LINQ к XSD создает объекты, это определяет Корень как наличие двух независимых списков Type1 и Type2. Здорово в этом это безопасно с точки зрения типов, но я теперь, кажется, теряю порядок элементов. Я создал LINQ к XSD из источника на codeplex.
Используя LINQ к XSD, как я могу сохранить порядок этих элементов?
Как насчет создания оболочки для Choice? Ограничение типов, к которым он обращается следующим образом:
class Choice
{
private object _value;
public ChoiceEnum CurrentType { get; private set; }
public Type1 Type1Value
{
get { return (Type1) _value; }
set { _value = value; CurrentType = ChoiceEnum.Type1; }
}
public Type2 Type2Value
{
get { return (Type2) _value; }
set { _value = value; CurrentType = ChoiceEnum.Type2; }
}
}
Это упрощенная версия, и вам придется добавить дополнительную проверку (если _value
имеет правильный тип, каков текущий тип _value
и т. Д.).
Затем вы можете отфильтровать его с помощью LINQ:
var q1 = from v in root.Sequence
where v.CurrentType == ChoiceEnum.Type1
select v.Type1;
Или вы можете создать методы в Root, которые будут заключать запросы.