我想知道是否有一个库 - 在.NET或其他方面 - 将.NET类型(例如Integer
,String
等)转换为XML datatypes(例如。int
,string
)。请注意,我希望转换 types ,而不是变量的内容。例如:
var xmlType = Convert.ToXmlType(typeof(bool));
Assert.That(xmlType.ToString(), Is.EqualTo("boolean"));
我不介意制作一个查找表,因为我没有处理太多的类型,但我认为重用这样的东西会很好,如果它已经在那里了。
答案 0 :(得分:3)
您可以使用以下代码创建映射,但它不是一对一映射。将此减少为一对一必须是您最终的实施细节:
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);
示例输出:
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
...
解决一对一问题的体面的方法是获取代码表中的第一个条目,该条目适用于除String
之外的所有类型。这也可能不适用于较新的 BCL类型,但可能会继续。 MS重新安排XmlTypeCode
枚举将是一个重大变化,但这并不是说这是万无一失的:
// same as above except the ToDictionary
.ToDictionary(
m => m.Type,
m => m.Type != typeof(string) ? m.XmlTypeCodes.First() : XmlTypeCode.String);
答案 1 :(得分:2)
我找到了使用框架本身的第二种方法。
XmlTypeMapping getQualifiedNameForSystemType(Type systemType_in)
{
SoapReflectionImporter sri = new SoapReflectionImporter();
return sri.ImportTypeMapping(systemType_in);
}