Хорошо, я нашел (плохое) решение с помощью Reflection:
private static string XML_SCHEMA_ELEMENT_SET_ELEMENT_TYPE_MEMBER_NAME = "SetElementType";
public static void ChangeElementType(this XmlSchemaElement element, XmlSchemaType type)
{
element.GetType().InvokeMember(XML_SCHEMA_ELEMENT_SET_ELEMENT_TYPE_MEMBER_NAME,
BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
null, element, new object[] { type });
}
Я провел анализ с .NET Reflector, и у них есть два свойства, которые содержат XmlSchemaType. Один, не только для чтения, предназначен для сериализации XML (он имеет атрибуты Xml *), а другой, который предназначен только для чтения, - как я думаю, для использования после компиляции - так что это более или менее «статическая» информация. Хорошая вещь в этом великолепном дизайне: вы не можете точно прочитать XSD, изменить некоторые части и сохранить его снова. Хорошо, я не проверяю это, но это то, что говорит мне Кодекс.
Итак, вот интересные части исходного кода XmlSchemaElement:
private XmlSchemaType elementType;
// ...
private XmlSchemaType type;
// ...
[XmlIgnore]
public XmlSchemaType ElementSchemaType
{
get
{
return this.elementType;
}
}
// ...
[XmlElement("complexType", typeof(XmlSchemaComplexType)), XmlElement("simpleType", typeof(XmlSchemaSimpleType))]
public XmlSchemaType SchemaType
{
get
{
return this.type;
}
set
{
this.type = value;
}
}
// ...
internal void SetElementType(XmlSchemaType value)
{
this.elementType = value;
}