Просмотр исходного кода

2007-05-15 Marek Habersack <[email protected]>

	* ConfigurationElement.cs: added value validation on
	deserialization from the config file.


svn path=/trunk/mcs/; revision=77394
Marek Habersack 18 лет назад
Родитель
Сommit
73ec289e15

+ 5 - 0
mcs/class/System.Configuration/System.Configuration/ChangeLog

@@ -1,3 +1,8 @@
+2007-05-15  Marek Habersack  <[email protected]>
+
+	* ConfigurationElement.cs: added value validation on
+	deserialization from the config file.
+
 2007-05-14 Igor Zelmanovich <[email protected]>
 
 	* ConfigurationElement.cs: when attribute value cannot be parsed,

+ 23 - 7
mcs/class/System.Configuration/System.Configuration/ConfigurationElement.cs

@@ -310,11 +310,17 @@ namespace System.Configuration
 				
 				if (readProps.ContainsKey (prop))
 					throw new ConfigurationException ("The attribute '" + prop.Name + "' may only appear once in this element.");
-				
+
+				string value = null;
 				try {
-					prop.SetStringValue (reader.Value);
-				}
-				catch (Exception ex) {
+					value = reader.Value;
+					ValidateValue (prop.Property, value);
+					prop.SetStringValue (value);
+				} catch (ConfigurationErrorsException) {
+					throw;
+				} catch (ConfigurationException) {
+					throw;
+				} catch (Exception ex) {
 					string msg = String.Format ("The value of the property '{0}' cannot be parsed.", prop.Name);
 					throw new ConfigurationErrorsException (msg, reader);
 				}
@@ -324,9 +330,7 @@ namespace System.Configuration
 			reader.MoveToElement ();
 			if (reader.IsEmptyElement) {
 				reader.Skip ();
-			}
-			else {
-
+			} else {
 				int depth = reader.Depth;
 
 				reader.ReadStartElement ();
@@ -538,6 +542,18 @@ namespace System.Configuration
 			PropertyInformation info = ElementInformation.Properties [propName];
 			return info != null && info.ValueOrigin == PropertyValueOrigin.SetHere;
 		}
+
+		void ValidateValue (ConfigurationProperty p, string value)
+		{
+			ConfigurationValidatorBase validator;
+			if (p == null || (validator = p.Validator) == null)
+				return;
+			
+			if (!validator.CanValidate (p.Type))
+				throw new ConfigurationException (
+					String.Format ("Validator does not support type {0}", p.Type));
+			validator.Validate (p.ConvertFromString (value));
+		}
 	}
 	
 	internal class ElementMap