2009-09-14 11 views
10

He estado usando xsd.exe para generar una clase para deserializar XML en. que tienen un valor decimal en el xsd fuente que no es necesaria:Valor anulable con la clase generada xsd.exe

<xs:attribute name="Balance" type="xs:decimal" use="optional" /> 

La clase resultante de xsd genera el siguiente código:

private decimal balanceField; 

[System.Xml.Serialization.XmlAttributeAttribute()] 
public decimal Balance { 
    get { 
     return this.balanceField; 
    } 
    set { 
     this.balanceField = value; 
    } 
} 

Qué observo no es anulable.

¿Cómo vez generan el campo como anulable, se ilustra de la siguiente manera:

private decimal? balanceField; 

[System.Xml.Serialization.XmlAttributeAttribute()] 
public decimal? Balance { 
    get { 
     return this.balanceField; 
    } 
    set { 
     this.balanceField = value; 
    } 
} 

Respuesta

8

Actualmente funciona como debería. Estoy usando v2.0.50727.42 xsd y:

<xs:element name="Port" type="xs:int" nillable="true" /> 

genera exactamente lo que usted ha estado buscando (sin redundante ...Specified campo y la propiedad):

private System.Nullable<int> portField; 

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] 
public System.Nullable<int> Port { 
    get { 
     return this.portField; 
    } 
    set { 
     this.portField = value; 
    } 
} 
+5

Eso solo funciona para elementos, no para atributos como la pregunta original. –

2

yo sólo he dado cuenta de que en realidad se ha incluido el siguiente código:

private bool balanceFieldSpecified; 

[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool BalanceSpecified { 
    get { 
     return this.balanceFieldSpecified; 
    } 
    set { 
     this.balanceFieldSpecified = value; 
    } 
} 

que proporciona la funcionalidad Necesito.

Dejaré la pregunta abierta por un tiempo en caso de que exista una manera elegante de utilizar nullable? escriba en su lugar.

+6

Por desgracia, fue de alrededor de xsd.exe mucho antes de los tipos anulables existentes en .NET Framework, por lo que tuvieron que encontrar una solución que funcionara en cualquier caso. No estoy al tanto de ninguna forma de decirle a xsd.exe que use tipos con nulos. ..... (¡Alguien debería intensificar y crear una alternativa útil a xsd.exe algún día! :-)) –

+0

Existe un kludge similar para xsd.exe generado DataSets, excepto que en lugar de una propiedad, la fila contendrá un método 'IsBalanceNull()'. –

+0

@marc_s xsd2code está tratando de proporcionar esa funcionalidad. –

5

Creo que si agrega nillable = "true" en su definición de esquema XML, XSD creará un tipo anulable para ese elemento. Esta es probablemente una buena idea de todos modos, ya que está dando a entender que este valor es, de hecho, anulable y esto haría que su definición de esquema sea más explícita a ese respecto.

Lamentablemente, todavía incluye el campo correspondiente "Especificado" en este caso. Si desea que el serializador obedezca directamente el valor que admite valores NULL, deberá eliminar manualmente la columna "xxSpecified" del código generado.

Cuestiones relacionadas