private object DeserializePropertyValue(ConfigurationProperty prop, XmlReader reader) {
Debug.Assert(prop != null, "prop != null");
Debug.Assert(reader != null, "reader != null");
// By default we try to load (i.e. parse/validate ) all properties
// If a property value is invalid ( cannot be parsed or is not valid ) we will keep the value
// as string ( from the xml ) and will write it out unchanged if needed
// If the property value is needed by users the actuall exception will be thrown
string xmlValue = reader.Value;
object propertyValue = null;
try {
propertyValue = prop.ConvertFromString(xmlValue);
// Validate the loaded and converted value
prop.Validate(propertyValue);
}
catch (ConfigurationException ce) {
// If the error is incomplete - complete it :)
if (string.IsNullOrEmpty(ce.Filename)) {
ce = new ConfigurationErrorsException(ce.Message, reader);
}
// Cannot parse/validate the value. Keep it as string
propertyValue = new InvalidPropValue(xmlValue, ce);
}
catch {
// If this is an exception related to the parsing/validating the
// value ConfigurationErrorsException should be thrown instead.
// If not - the exception is ok to surface out of here
Debug.Fail("Unknown exception type thrown");
}
return propertyValue;
}