C# 在代码生成(通过xsd.exe)类中调用子类属性
我试图从一个XSD生成代码,该XSD有两个扩展公共complexType的complexType。继承者有一个名为“value”的公共属性,该属性具有不同的类型。当然,由于XSD规则,我不能将它放在我的基类型上。我的意图是以多态方式调用基类型上的属性,这将调用子类上的正确方法。这可能吗 这是我的XSDC# 在代码生成(通过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
<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 ...
}