Răsfoiți Sursa

[system.xml] Support more primitive types in XmlReader::ReadContentAs

Marek Safar 12 ani în urmă
părinte
comite
a6e236b2d6

+ 3 - 3
mcs/class/System.XML/System.Xml/XQueryConvert.cs

@@ -566,17 +566,17 @@ namespace System.Xml
 			return XmlConvert.ToDateTime (value);
 		}
 
-		public static long StringToUnsignedInt (string value)
+		public static UInt32 StringToUnsignedInt (string value)
 		{
 			return XmlConvert.ToUInt32 (value);
 		}
 
-		public static decimal StringToUnsignedLong (string value)
+		public static UInt64 StringToUnsignedLong (string value)
 		{
 			return XmlConvert.ToUInt64 (value);
 		}
 
-		public static int StringToUnsignedShort (string value)
+		public static UInt16 StringToUnsignedShort (string value)
 		{
 			return XmlConvert.ToUInt16 (value);
 		}

+ 16 - 4
mcs/class/System.XML/System.Xml/XmlReader.cs

@@ -1066,16 +1066,28 @@ namespace System.Xml
 				switch (Type.GetTypeCode (type)) {
 				case TypeCode.Boolean:
 					return XQueryConvert.StringToBoolean (text);
+				case TypeCode.Byte:
+					return XmlConvert.ToByte (text);
+				case TypeCode.SByte:
+					return XmlConvert.ToSByte (text);
+				case TypeCode.Int16:
+					return XmlConvert.ToInt16 (text);
+				case TypeCode.UInt16:
+					return XQueryConvert.StringToUnsignedShort (text);
+				case TypeCode.Int32:
+					return XQueryConvert.StringToInt (text);
+				case TypeCode.UInt32:
+					return XQueryConvert.StringToUnsignedInt (text);
+				case TypeCode.Int64:
+					return XQueryConvert.StringToInteger (text);
+				case TypeCode.UInt64:
+					return XQueryConvert.StringToUnsignedLong (text);
 				case TypeCode.DateTime:
 					return XQueryConvert.StringToDateTime (text);
 				case TypeCode.Decimal:
 					return XQueryConvert.StringToDecimal (text);
 				case TypeCode.Double:
 					return XQueryConvert.StringToDouble (text);
-				case TypeCode.Int32:
-					return XQueryConvert.StringToInt (text);
-				case TypeCode.Int64:
-					return XQueryConvert.StringToInteger (text);
 				case TypeCode.Single:
 					return XQueryConvert.StringToFloat (text);
 				case TypeCode.String:

+ 17 - 0
mcs/class/System.XML/Test/System.Xml/XmlReaderCommonTests.cs

@@ -2270,6 +2270,23 @@ namespace MonoTests.System.Xml
 			Assert.AreEqual (arr [1], ret [1], "#3");
 		}
 
+		[Test]
+		public void ReadContentAs ()
+		{
+			var xr = XmlReader.Create (new StringReader ("<doc a=' 1 '/>"));
+			xr.Read ();
+			xr.MoveToAttribute ("a");
+
+			Assert.AreEqual ((Byte) 1, xr.ReadContentAs (typeof (Byte), null), "#1");
+			Assert.AreEqual ((SByte) 1, xr.ReadContentAs (typeof (SByte), null), "#2");
+			Assert.AreEqual ((Int16) 1, xr.ReadContentAs (typeof (Int16), null), "#3");
+			Assert.AreEqual ((UInt16) 1, xr.ReadContentAs (typeof (UInt16), null), "#4");
+			Assert.AreEqual ((Int32) 1, xr.ReadContentAs (typeof (Int32), null), "#5");
+			Assert.AreEqual ((UInt32) 1, xr.ReadContentAs (typeof (UInt32), null), "#6");
+			Assert.AreEqual ((Int64) 1, xr.ReadContentAs (typeof (Int64), null), "#7");
+			Assert.AreEqual ((UInt64) 1, xr.ReadContentAs (typeof (UInt64), null), "#8");
+		}
+
 #if NET_4_5
 		[Test]
 		[ExpectedException(typeof(InvalidOperationException))]