Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Configuration / System / Configuration / ConfigurationProperty.cs / 1305376 / ConfigurationProperty.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System; using System.ComponentModel; using System.Security.Permissions; using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using System.Text; namespace System.Configuration { public sealed class ConfigurationProperty { internal static readonly ConfigurationValidatorBase NonEmptyStringValidator = new StringValidator(1); private readonly static ConfigurationValidatorBase DefaultValidatorInstance = new DefaultValidator(); internal static readonly string DefaultCollectionPropertyName = ""; private string _name; private string _providedName; private string _description; private Type _type; private Object _defaultValue; private TypeConverter _converter; private ConfigurationPropertyOptions _options; private ConfigurationValidatorBase _validator; private String _addElementName = null; private String _removeElementName = null; private String _clearElementName = null; private bool _isTypeInited; private bool _isConfigurationElementType; public ConfigurationProperty(String name, Type type) { object defaultValue = null; ConstructorInit(name, type, ConfigurationPropertyOptions.None, null, null); if (type == typeof(string)) { defaultValue = String.Empty; } else if (type.IsValueType) { defaultValue = TypeUtil.CreateInstanceWithReflectionPermission(type); } SetDefaultValue(defaultValue); } public ConfigurationProperty(String name, Type type, Object defaultValue) : this(name, type, defaultValue, ConfigurationPropertyOptions.None) { } public ConfigurationProperty(String name, Type type, Object defaultValue, ConfigurationPropertyOptions options) : this(name, type, defaultValue, null, null, options) { } public ConfigurationProperty(String name, Type type, Object defaultValue, TypeConverter typeConverter, ConfigurationValidatorBase validator, ConfigurationPropertyOptions options) : this(name, type, defaultValue, typeConverter, validator, options, null) { } public ConfigurationProperty(String name, Type type, Object defaultValue, TypeConverter typeConverter, ConfigurationValidatorBase validator, ConfigurationPropertyOptions options, string description) { ConstructorInit(name, type, options, validator, typeConverter); SetDefaultValue(defaultValue); } internal ConfigurationProperty(PropertyInfo info) { Debug.Assert(info != null, "info != null"); // Bellow are the attributes we handle TypeConverterAttribute attribConverter = null; ConfigurationPropertyAttribute attribProperty = null; ConfigurationValidatorAttribute attribValidator = null; // Compatability attributes // If the approprite data is provided in the ConfigPropAttribute then the one bellow will be ignored DescriptionAttribute attribStdDescription = null; DefaultValueAttribute attribStdDefault = null; TypeConverter typeConverter = null; ConfigurationValidatorBase validator = null; // Find the interesting attributes in the collection foreach (Attribute attribute in Attribute.GetCustomAttributes(info)) { if (attribute is TypeConverterAttribute) { attribConverter = (TypeConverterAttribute)attribute; typeConverter = (TypeConverter)TypeUtil.CreateInstanceWithReflectionPermission(attribConverter.ConverterTypeName); } else if (attribute is ConfigurationPropertyAttribute) { attribProperty = (ConfigurationPropertyAttribute)attribute; } else if (attribute is ConfigurationValidatorAttribute) { // There could be more then one validator attribute specified on a property // Currently we consider this an error since it's too late to fix it for whidbey // but the right thing to do is to introduce new validator type ( CompositeValidator ) that is a list of validators and executes // them all if (validator != null) { throw new ConfigurationErrorsException(SR.GetString(SR.Validator_multiple_validator_attributes, info.Name)); } attribValidator = (ConfigurationValidatorAttribute)attribute; validator = attribValidator.ValidatorInstance; } else if (attribute is DescriptionAttribute) { attribStdDescription = (DescriptionAttribute)attribute; } else if (attribute is DefaultValueAttribute) { attribStdDefault = (DefaultValueAttribute)attribute; } } Type propertyType = info.PropertyType; // Collections need some customization when the collection attribute is present if (typeof(ConfigurationElementCollection).IsAssignableFrom(propertyType)) { ConfigurationCollectionAttribute attribCollection = Attribute.GetCustomAttribute(info, typeof(ConfigurationCollectionAttribute)) as ConfigurationCollectionAttribute; // If none on the property - see if there is an attribute on the collection type itself if (attribCollection == null) { attribCollection = Attribute.GetCustomAttribute(propertyType, typeof(ConfigurationCollectionAttribute)) as ConfigurationCollectionAttribute; } if (attribCollection != null) { if (attribCollection.AddItemName.IndexOf(',') == -1) { _addElementName = attribCollection.AddItemName; } _removeElementName = attribCollection.RemoveItemName; _clearElementName = attribCollection.ClearItemsName; } } // This constructor shouldnt be invoked if the reflection info is not for an actual config property Debug.Assert(attribProperty != null, "attribProperty != null"); ConstructorInit(attribProperty.Name, info.PropertyType, attribProperty.Options, validator, typeConverter); // Figure out the default value InitDefaultValueFromTypeInfo(attribProperty, attribStdDefault); // Get the description if ((attribStdDescription != null) && !string.IsNullOrEmpty(attribStdDescription.Description)) { _description = attribStdDescription.Description; } } private void ConstructorInit(string name, Type type, ConfigurationPropertyOptions options, ConfigurationValidatorBase validator, TypeConverter converter) { if (typeof(ConfigurationSection).IsAssignableFrom(type)) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_properties_may_not_be_derived_from_configuration_section, name)); } _providedName = name; // save the provided name so we can check for default collection names if ((options & ConfigurationPropertyOptions.IsDefaultCollection) != 0 && String.IsNullOrEmpty(name)) { name = DefaultCollectionPropertyName; } else { ValidatePropertyName(name); } _name = name; _type = type; _options = options; _validator = validator; _converter = converter; // Use the default validator if none was supplied if (_validator == null) { _validator = DefaultValidatorInstance; } else { // Make sure the supplied validator supports the type of this property if (!_validator.CanValidate(_type)) { throw new ConfigurationErrorsException(SR.GetString(SR.Validator_does_not_support_prop_type, _name)); } } } private void ValidatePropertyName(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException(SR.GetString(SR.String_null_or_empty), "name"); } if (BaseConfigurationRecord.IsReservedAttributeName(name)) { throw new ArgumentException(SR.GetString(SR.Property_name_reserved, name)); } } private void SetDefaultValue(object value) { // Validate the default value if any. This should make errors from invalid defaults easier to catch if (value != null && value != ConfigurationElement.s_nullPropertyValue) { bool canAssign = _type.IsAssignableFrom(value.GetType()); if (!canAssign && this.Converter.CanConvertFrom(value.GetType())) { value = this.Converter.ConvertFrom(value); } else if (!canAssign) { throw new ConfigurationErrorsException(SR.GetString(SR.Default_value_wrong_type, _name)); } Validate(value); _defaultValue = value; } } private void InitDefaultValueFromTypeInfo(ConfigurationPropertyAttribute attribProperty, DefaultValueAttribute attribStdDefault) { object defaultValue = attribProperty.DefaultValue; // If there is no default value there - try the other attribute ( the clr standard one ) if ((defaultValue == null || defaultValue == ConfigurationElement.s_nullPropertyValue) && (attribStdDefault != null)) { defaultValue = attribStdDefault.Value; } // If there was a default value in the prop attribute - check if we need to convert it from string if ((defaultValue != null) && (defaultValue is string) && (_type != typeof(string))) { // Use the converter to parse this property default value try { defaultValue = Converter.ConvertFromInvariantString((string)defaultValue); } catch (Exception ex) { throw new ConfigurationErrorsException(SR.GetString(SR.Default_value_conversion_error_from_string, _name, ex.Message)); } } if (defaultValue == null || defaultValue == ConfigurationElement.s_nullPropertyValue) { if (_type == typeof(string)) { defaultValue = String.Empty; } else if (_type.IsValueType) { defaultValue = TypeUtil.CreateInstanceWithReflectionPermission(_type); } } SetDefaultValue(defaultValue); } public string Name { get { return _name; } } public string Description { get { return _description; } } internal string ProvidedName { get { return _providedName; } } internal bool IsConfigurationElementType { get { if (!_isTypeInited) { _isConfigurationElementType = typeof(ConfigurationElement).IsAssignableFrom(_type); _isTypeInited = true; } return _isConfigurationElementType; } } public Type Type { get { return _type; } } public Object DefaultValue { get { return _defaultValue; } } public bool IsRequired { get { return (_options & ConfigurationPropertyOptions.IsRequired) != 0; } } public bool IsKey { get { return (_options & ConfigurationPropertyOptions.IsKey) != 0; } } public bool IsDefaultCollection { get { return ((_options & ConfigurationPropertyOptions.IsDefaultCollection) != 0); } } public bool IsTypeStringTransformationRequired { get { return (_options & ConfigurationPropertyOptions.IsTypeStringTransformationRequired) != 0; } } public bool IsAssemblyStringTransformationRequired { get { return (_options & ConfigurationPropertyOptions.IsAssemblyStringTransformationRequired) != 0; } } public bool IsVersionCheckRequired { get { return (_options & ConfigurationPropertyOptions.IsVersionCheckRequired) != 0; } } public TypeConverter Converter { get { CreateConverter(); return _converter; } } public ConfigurationValidatorBase Validator { get { return _validator; } } internal String AddElementName { get { return _addElementName; } } internal String RemoveElementName { get { return _removeElementName; } } internal String ClearElementName { get { return _clearElementName; } } internal Object ConvertFromString(string value) { object result = null; try { result = Converter.ConvertFromInvariantString(value); } catch (Exception ex) { throw new ConfigurationErrorsException(SR.GetString(SR.Top_level_conversion_error_from_string, _name, ex.Message)); } return result; } internal string ConvertToString(Object value) { string result = null; try { if (_type == typeof(bool)) { result = ((bool)value) ? "true" : "false"; // the converter will break 1.1 compat for bool } else { result = Converter.ConvertToInvariantString(value); } } catch (Exception ex) { throw new ConfigurationErrorsException(SR.GetString(SR.Top_level_conversion_error_to_string, _name, ex.Message)); } return result; } internal void Validate(object value) { try { _validator.Validate(value); } catch (Exception ex) { throw new ConfigurationErrorsException(SR.GetString(SR.Top_level_validation_error, _name, ex.Message),ex); } } private void CreateConverter() { // Some properties cannot have type converters. // Such examples are properties that are ConfigurationElement ( derived classes ) // or properties which are user-defined and the user code handles serialization/desirialization so // the property itself is never converted to/from string if (_converter == null) { // Enums are exception. We use our custom converter for all enums if (_type.IsEnum) { _converter = new GenericEnumConverter(_type); } else if (!_type.IsSubclassOf(typeof(ConfigurationElement))) { _converter = TypeDescriptor.GetConverter(_type); if ((_converter == null) || !_converter.CanConvertFrom(typeof(String)) || !_converter.CanConvertTo(typeof(String))) { throw new ConfigurationErrorsException(SR.GetString(SR.No_converter, _name, _type.Name)); } } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UnsafeNativeMethods.cs
- Console.cs
- BezierSegment.cs
- Part.cs
- MenuDesigner.cs
- SqlServices.cs
- FileRegion.cs
- StringHandle.cs
- RTLAwareMessageBox.cs
- ParentUndoUnit.cs
- PrintDocument.cs
- EntitySetBase.cs
- CodeRegionDirective.cs
- ValueType.cs
- XmlSiteMapProvider.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- CommonDialog.cs
- InputDevice.cs
- ButtonField.cs
- RelatedView.cs
- AmbientLight.cs
- RuleSettingsCollection.cs
- ArrayList.cs
- Maps.cs
- CompilerErrorCollection.cs
- DrawingContextDrawingContextWalker.cs
- ProgressBarRenderer.cs
- EndpointAddressElementBase.cs
- NativeWrapper.cs
- WindowsPrincipal.cs
- SemaphoreSecurity.cs
- FocusWithinProperty.cs
- UpdateRecord.cs
- MouseActionValueSerializer.cs
- ClientBuildManagerTypeDescriptionProviderBridge.cs
- SelectorItemAutomationPeer.cs
- XmlSequenceWriter.cs
- Axis.cs
- DecimalAnimationBase.cs
- OAVariantLib.cs
- RelOps.cs
- Enumerable.cs
- PathGeometry.cs
- Privilege.cs
- ColorConverter.cs
- UserPreferenceChangedEventArgs.cs
- ToolBarOverflowPanel.cs
- DatatypeImplementation.cs
- IntSecurity.cs
- connectionpool.cs
- WindowsAuthenticationEventArgs.cs
- SQLRoleProvider.cs
- ExeContext.cs
- ResXResourceSet.cs
- MasterPageCodeDomTreeGenerator.cs
- RepeaterDesigner.cs
- XappLauncher.cs
- TraceContextEventArgs.cs
- ResourceWriter.cs
- JoinGraph.cs
- CategoryEditor.cs
- SiteMapNode.cs
- SqlDataSource.cs
- ImageCodecInfo.cs
- DataBoundControlAdapter.cs
- RTLAwareMessageBox.cs
- XmlAttributes.cs
- DataGridViewComponentPropertyGridSite.cs
- PageTheme.cs
- ImpersonationContext.cs
- ReadOnlyPropertyMetadata.cs
- PageThemeCodeDomTreeGenerator.cs
- BasicKeyConstraint.cs
- HatchBrush.cs
- Item.cs
- MatrixValueSerializer.cs
- OutputCacheSettingsSection.cs
- SocketElement.cs
- GeometryHitTestResult.cs
- InlineCategoriesDocument.cs
- DataSpaceManager.cs
- SystemUdpStatistics.cs
- MenuAdapter.cs
- ItemCollection.cs
- CommonProperties.cs
- KeyValuePairs.cs
- RowTypePropertyElement.cs
- DNS.cs
- Scene3D.cs
- BamlStream.cs
- EmptyEnumerator.cs
- SByteStorage.cs
- Renderer.cs
- HttpListenerRequest.cs
- GridViewSortEventArgs.cs
- CompoundFileDeflateTransform.cs
- DataServiceRequest.cs
- MimeWriter.cs
- EmitterCache.cs
- DataGridViewRowCancelEventArgs.cs