C# 在代码生成(通过xsd.exe)类中调用子类属性

C# 在代码生成(通过xsd.exe)类中调用子类属性,c#,xsd,code-generation,C#,Xsd,Code Generation,我试图从一个XSD生成代码,该XSD有两个扩展公共complexType的complexType。继承者有一个名为“value”的公共属性,该属性具有不同的类型。当然,由于XSD规则,我不能将它放在我的基类型上。我的意图是以多态方式调用基类型上的属性,这将调用子类上的正确方法。这可能吗 这是我的XSD <xs:complexType name="Property"> <xs:attribute name="name" type="xs:string" use="requ

我试图从一个XSD生成代码,该XSD有两个扩展公共complexType的complexType。继承者有一个名为“value”的公共属性,该属性具有不同的类型。当然,由于XSD规则,我不能将它放在我的基类型上。我的意图是以多态方式调用基类型上的属性,这将调用子类上的正确方法。这可能吗

这是我的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>
我尝试在property对象上实现一个“value”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()是一个方法,通过它实际使用的属性的子类来确定它应该具有什么样的返回类型?请原谅我太懒了。我习惯于相信这一点

您正在反序列化为
属性
对象,因此序列化程序将创建类型为
属性
的对象。在运行时,您将不知道您是否具有
BoolProperty
StringProperty

您需要从XML中提取StringProperties,将它们反序列化为
StringProperty
对象,然后对Boolproperty进行同样的处理

然后,您可以将它们合并到一个类型为
属性的列表中。然后,只要您在基类上创建一个在实现类中重写的
虚拟属性,应用程序就会像预期的那样运行


对作者编辑的回应
它将不起作用,因为此时您没有正确的信息。您必须将对象显式反序列化为
StringProperty
,才能让.NET识别您的属性。您将永远无法检测函数中的propertytype

如果您有正确类型的
属性
对象,则可以创建扩展方法以便于:

public string GetValue(this Property property)
{
    if(property is StringProperty) return ((StringProperty)property).Value;
    else if ...
}

但是,您需要知道这里的正确类型,您不知道您是否正在将实体反序列化为
属性
对象。

我认为不可能以您尝试的方式进行

不过,您可以利用分部类机制

例如,您可以为属性分部类添加另一个文件,并添加一个名为“public virtual string ValueToString()”的虚拟方法,在StringProperty和BoolProperty中重写它(也可以通过分部类机制)。这样,您就可以使foreach工作(调用property.ValueToString())


当然,这意味着您必须在生成类后进行自定义工作,但我看不到其他方法。

感谢快速回复!不过,我还有一个跟进问题,我也猜到了。我认为如果没有XSD对扩展和覆盖的限制,这会更容易。谢谢你,简!
            foreach (Property property in config.ConfigProperties)
            {
                somevalue = property.GetValue();
            }
public string GetValue(this Property property)
{
    if(property is StringProperty) return ((StringProperty)property).Value;
    else if ...
}