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);
¡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