2011-07-20 17 views
5

Me pregunto si hay una biblioteca (en .NET o no) que convierta tipos de .NET (por ejemplo, Integer, String, etc.) en XML datatypes (por ejemplo, int,). Tenga en cuenta que estoy tratando de convertir tipos, no el contenido de las variables. Por ejemplo:¿Obtiene un tipo de datos XML de un tipo .NET?

var xmlType = Convert.ToXmlType(typeof(bool)); 
Assert.That(xmlType.ToString(), Is.EqualTo("boolean")); 

no me importa hacer una tabla de búsqueda, ya que no estoy tratando con demasiados tipos, pero pensé que sería bueno volver a utilizar tal cosa si ya está ahí fuera.

Respuesta

3

Puede usar el siguiente código para crear las asignaciones, sin embargo, no es un mapeo de uno a uno. La reducción de este a uno-a-uno tendrá que ser un detalle de implementación en su final:

var mapping = (from XmlTypeCode cc in Enum.GetValues(typeof(XmlTypeCode)) 
       let xt = XmlSchemaType.GetBuiltInSimpleType(cc) 
       where xt != null 
       group cc by xt.Datatype.ValueType into gg 
       select new { Type = gg.Key, XmlTypeCodes = gg.ToArray() }) 
       .ToDictionary(m => m.Type, m => m.XmlTypeCodes); 

Salida de ejemplo:

System.Boolean => Boolean 
System.Byte => UnsignedByte 
System.Byte[] => HexBinary,Base64Binary 
System.DateTime => DateTime,Time,Date,GYearMonth,GYear,GMonthDay,GDay,GMonth 
System.Decimal => Decimal,Integer,NonPositiveInteger,NegativeInteger,NonNegative 
Integer,PositiveInteger 
... 

Un decente enfoque para resolver el uno-a -uno de los problemas sería tomar la primera entrada en la tabla de códigos que funciona para todos los tipos excepto String. Esto también puede no funcionar para más nuevos tipos BCL, pero es probable que deba seguir adelante. Sería un cambio importante para la EM para reorganizar la enumeración XmlTypeCode, pero eso no quiere decir que esto es a toda prueba:

// same as above except the ToDictionary 
.ToDictionary(
    m => m.Type, 
    m => m.Type != typeof(string) ? m.XmlTypeCodes.First() : XmlTypeCode.String); 
+0

¡Eso es exactamente lo que tenía en mente! Y gracias también por la idea de llegar a un mapeo uno a uno; No me importa hard-coding una excepción para cadenas. – ladenedge

2

me encontré con un segundo abordaje utilizando el marco itselfe.

XmlTypeMapping getQualifiedNameForSystemType(Type systemType_in) 
{ 
    SoapReflectionImporter sri = new SoapReflectionImporter(); 
    return sri.ImportTypeMapping(systemType_in); 
} 
Cuestiones relacionadas