我想从具有两个扩展公共complexType的complexType的XSD生成代码。继承者有一个名为“value”的公共属性,它有不同的类型。由于XSD规则,我无法将其放在我的基本类型上。我的目的是多态地调用基类型的属性,这将调用子类的正确方法。这可能吗?在代码生成(通过xsd.exe)类中调用子类属性
这里是我的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>
这将生成以下代码:
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;
}
}
}
这里就是我想要做的:
// 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);
}
我试图实现一个 “值” Property对象上的getter属性希望子类的“value”属性定义可以隐藏它,但事实并非如此这样的伎俩:
public partial class Property
{
public virtual string value
{
get { throw new NotImplementedException(); } // this method is called instead of the Property subclass methods
}
}
后续问题编辑:这些问题的答案证实了我的担心,这是不可能的。它仍然会是可能的,虽然做以某种方式如下:
foreach (Property property in config.ConfigProperties)
{
somevalue = property.GetValue();
}
其中的GetValue()是计算出的方法是什么返回类型应该凭借它实际上是使用属性的子类的有哪些?请原谅我非常懒惰。我被给予相信it's a virtue。 =)
我猜测一样多。如果没有扩展和覆盖的XSD限制,我认为这会更容易。谢谢你! – Jeremy 2009-12-17 15:55:03