J'essaie de générer du code à partir d'un XSD qui a deux types complexes qui étendent un complexType commun. Les héritiers ont une propriété commune appelée "valeur", qui a différents types. Bien sûr, je ne peux pas le mettre sur mon type de base en raison des règles XSD. Mon intention est d'appeler polymorphiquement la propriété sur le type de base qui invoquerait la bonne méthode sur la sous-classe. Est-ce possible?Appel des propriétés de sous-classes dans les classes générées par le code (via xsd.exe)
Voici mon XSD
<xs:complexType name="Property">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="StringProperty">
<xs:complexContent>
<xs:extension base="Property">
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="BooleanProperty">
<xs:complexContent>
<xs:extension base="Property">
<xs:attribute name="value" type="xs:boolean" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Cela génère le code suivant:
public partial class Property {
private string nameField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string name {
get {
return this.nameField;
}
set {
this.nameField = value;
}
}
}
public partial class StringProperty : Property {
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string value {
get {
return this.valueField;
}
set {
this.valueField = value;
}
}
}
public partial class BoolProperty : Property {
private bool valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public bool value {
get {
return this.valueField;
}
set {
this.valueField = value;
}
}
}
Et voici ce que je veux faire:
// ConfigProperties is an array of Property objects
foreach (Property property in config.ConfigProperties)
{
// Doesn't compile since Property.value doesn't exist in the base class.
Console.WriteLine(property.value);
}
J'ai essayé de mettre en œuvre une "valeur" propriété getter sur l'objet Property en espérant que les définitions de propriété "value" des sous-classes le masqueraient, mais cela ne faire l'affaire:
public partial class Property
{
public virtual string value
{
get { throw new NotImplementedException(); } // this method is called instead of the Property subclass methods
}
}
QUESTION DE SUIVI EDIT: Les réponses confirment mes craintes que cela est impossible. Serait-il encore possible que de faire ce qui suit d'une certaine manière:
foreach (Property property in config.ConfigProperties)
{
somevalue = property.GetValue();
}
où GetValue() est une méthode qui figure sur ce type de retour, il doit avoir en vertu de la sous-classe de la propriété qu'il utilise réellement? Pardonnez-moi d'être extrêmement paresseux. Je suis donné à croire que it's a virtue. =)
Je l'ai deviné autant. Je pense que cela aurait été plus facile s'il n'y avait pas les limitations XSD sur les extensions et les remplacements. Merci, Jan! – Jeremy