Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / CompMod / System / ComponentModel / ComponentResourceManager.cs / 1 / ComponentResourceManager.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.ComponentModel { using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Resources; using System.Security.Permissions; ////// The ComponentResourceManager is a resource manager object that /// provides simple functionality for enumerating resources for /// a component or object. /// [HostProtection(SharedState = true)] public class ComponentResourceManager : ResourceManager { private Hashtable _resourceSets; private CultureInfo _neutralResourcesCulture; public ComponentResourceManager() : base() { } public ComponentResourceManager(Type t) : base(t) { } ////// The culture of the main assembly's neutral resources. If someone is asking for this culture's resources, /// we don't need to walk up the parent chain. /// private CultureInfo NeutralResourcesCulture { get { if (_neutralResourcesCulture == null && MainAssembly != null) { _neutralResourcesCulture = GetNeutralResourcesLanguage(MainAssembly); } return _neutralResourcesCulture; } } ////// This method examines all the resources for the current culture. /// When it finds a resource with a key in the format of /// "[objectName].[property name]" it will apply that resource's value /// to the corresponding property on the object. If there is no matching /// property the resource will be ignored. /// public void ApplyResources(object value, string objectName) { ApplyResources(value, objectName, null); } ////// This method examines all the resources for the provided culture. /// When it finds a resource with a key in the format of /// "[objectName].[property name]" it will apply that resource's value /// to the corresponding property on the object. If there is no matching /// property the resource will be ignored. /// public virtual void ApplyResources(object value, string objectName, CultureInfo culture) { if (value == null) { throw new ArgumentNullException("value"); } if (objectName == null) { throw new ArgumentNullException("objectName"); } if (culture == null) { culture = CultureInfo.CurrentUICulture; } // The general case here will be to always use the same culture, so optimize for // that. The resourceSets hashtable uses culture as a key. It's value is // a sorted dictionary that contains ALL the culture values (so it traverses up // the parent culture chain) for that culture. This means that if ApplyResources // is called with different cultures there could be some redundancy in the // table, but it allows the normal case of calling with a single culture to // be much faster. // // The reason we use a SortedDictionary here is to ensure the resources are applied // in an order consistent with codedom deserialization. SortedListresources; if (_resourceSets == null) { ResourceSet dummy; _resourceSets = new Hashtable(); resources = FillResources(culture, out dummy); _resourceSets[culture] = resources; } else { resources = (SortedList )_resourceSets[culture]; if (resources == null || (resources.Comparer.Equals(StringComparer.OrdinalIgnoreCase) != IgnoreCase)) { ResourceSet dummy; resources = FillResources(culture, out dummy); _resourceSets[culture] = resources; } } BindingFlags flags = BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance; if (IgnoreCase) { flags |= BindingFlags.IgnoreCase; } bool componentReflect = false; if (value is IComponent) { ISite site = ((IComponent)value).Site; if (site != null && site.DesignMode) { componentReflect = true; } } foreach(KeyValuePair kvp in resources) { // See if this key matches our object. // string key = kvp.Key; if (key == null) { continue; } if (IgnoreCase) { if (string.Compare(key, 0, objectName, 0, objectName.Length, StringComparison.OrdinalIgnoreCase) != 0) { continue; } } else { if (string.CompareOrdinal(key, 0, objectName, 0, objectName.Length) != 0) { continue; } } // Character after objectName.Length should be a ".", or else we should continue. // int idx = objectName.Length; if (key.Length <= idx || key[idx] != '.' ) { continue; } // Bypass type descriptor if we are not in design mode. TypeDescriptor does an attribute // scan which is quite expensive. // string propName = key.Substring(idx + 1); if (componentReflect) { PropertyDescriptor prop = TypeDescriptor.GetProperties(value).Find(propName, IgnoreCase); if (prop != null && !prop.IsReadOnly && (kvp.Value == null || prop.PropertyType.IsInstanceOfType(kvp.Value))) { prop.SetValue(value, kvp.Value); } } else { PropertyInfo prop = null; try { prop = value.GetType().GetProperty(propName, flags); } catch (AmbiguousMatchException) { // Looks like we ran into a conflict between a declared property and an inherited one. // In such cases, we choose the most declared one. Type t = value.GetType(); do { prop = t.GetProperty(propName, flags | BindingFlags.DeclaredOnly); t = t.BaseType; } while(prop == null && t != null && t != typeof(object)); } if (prop != null && prop.CanWrite && (kvp.Value == null || prop.PropertyType.IsInstanceOfType(kvp.Value))) { prop.SetValue(value, kvp.Value, null); } } } } /// /// Recursive routine that creates a resource hashtable /// populated with resources for culture and all parent /// cultures. /// private SortedListFillResources(CultureInfo culture, out ResourceSet resourceSet) { SortedList sd; ResourceSet parentResourceSet = null; // Traverse parents first, so we always replace more // specific culture values with less specific. // if (!culture.Equals(CultureInfo.InvariantCulture) && !culture.Equals(NeutralResourcesCulture)) { sd = FillResources(culture.Parent, out parentResourceSet); } else { // We're at the bottom, so create the sorted dictionary // if (IgnoreCase) { sd = new SortedList (StringComparer.OrdinalIgnoreCase); } else { sd = new SortedList (StringComparer.Ordinal); } } // Now walk culture's resource set. Another thing we // do here is ask ResourceManager to traverse up the // parent chain. We do NOT want to do this because // we are trawling up the parent chain ourselves, but by // passing in true for the second parameter the resource // manager will cache the culture it did find, so when we // do recurse all missing resources will be filled in // so we are very fast. That's why we remember what our // parent resource set's instance was -- if they are the // same, we're looking at a cache we've already applied. // resourceSet = GetResourceSet(culture, true, true); if (resourceSet != null && !object.ReferenceEquals(resourceSet, parentResourceSet)) { foreach(DictionaryEntry de in resourceSet) { sd[(string)de.Key] = de.Value; } } return sd; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.ComponentModel { using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Resources; using System.Security.Permissions; ////// The ComponentResourceManager is a resource manager object that /// provides simple functionality for enumerating resources for /// a component or object. /// [HostProtection(SharedState = true)] public class ComponentResourceManager : ResourceManager { private Hashtable _resourceSets; private CultureInfo _neutralResourcesCulture; public ComponentResourceManager() : base() { } public ComponentResourceManager(Type t) : base(t) { } ////// The culture of the main assembly's neutral resources. If someone is asking for this culture's resources, /// we don't need to walk up the parent chain. /// private CultureInfo NeutralResourcesCulture { get { if (_neutralResourcesCulture == null && MainAssembly != null) { _neutralResourcesCulture = GetNeutralResourcesLanguage(MainAssembly); } return _neutralResourcesCulture; } } ////// This method examines all the resources for the current culture. /// When it finds a resource with a key in the format of /// "[objectName].[property name]" it will apply that resource's value /// to the corresponding property on the object. If there is no matching /// property the resource will be ignored. /// public void ApplyResources(object value, string objectName) { ApplyResources(value, objectName, null); } ////// This method examines all the resources for the provided culture. /// When it finds a resource with a key in the format of /// "[objectName].[property name]" it will apply that resource's value /// to the corresponding property on the object. If there is no matching /// property the resource will be ignored. /// public virtual void ApplyResources(object value, string objectName, CultureInfo culture) { if (value == null) { throw new ArgumentNullException("value"); } if (objectName == null) { throw new ArgumentNullException("objectName"); } if (culture == null) { culture = CultureInfo.CurrentUICulture; } // The general case here will be to always use the same culture, so optimize for // that. The resourceSets hashtable uses culture as a key. It's value is // a sorted dictionary that contains ALL the culture values (so it traverses up // the parent culture chain) for that culture. This means that if ApplyResources // is called with different cultures there could be some redundancy in the // table, but it allows the normal case of calling with a single culture to // be much faster. // // The reason we use a SortedDictionary here is to ensure the resources are applied // in an order consistent with codedom deserialization. SortedListresources; if (_resourceSets == null) { ResourceSet dummy; _resourceSets = new Hashtable(); resources = FillResources(culture, out dummy); _resourceSets[culture] = resources; } else { resources = (SortedList )_resourceSets[culture]; if (resources == null || (resources.Comparer.Equals(StringComparer.OrdinalIgnoreCase) != IgnoreCase)) { ResourceSet dummy; resources = FillResources(culture, out dummy); _resourceSets[culture] = resources; } } BindingFlags flags = BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance; if (IgnoreCase) { flags |= BindingFlags.IgnoreCase; } bool componentReflect = false; if (value is IComponent) { ISite site = ((IComponent)value).Site; if (site != null && site.DesignMode) { componentReflect = true; } } foreach(KeyValuePair kvp in resources) { // See if this key matches our object. // string key = kvp.Key; if (key == null) { continue; } if (IgnoreCase) { if (string.Compare(key, 0, objectName, 0, objectName.Length, StringComparison.OrdinalIgnoreCase) != 0) { continue; } } else { if (string.CompareOrdinal(key, 0, objectName, 0, objectName.Length) != 0) { continue; } } // Character after objectName.Length should be a ".", or else we should continue. // int idx = objectName.Length; if (key.Length <= idx || key[idx] != '.' ) { continue; } // Bypass type descriptor if we are not in design mode. TypeDescriptor does an attribute // scan which is quite expensive. // string propName = key.Substring(idx + 1); if (componentReflect) { PropertyDescriptor prop = TypeDescriptor.GetProperties(value).Find(propName, IgnoreCase); if (prop != null && !prop.IsReadOnly && (kvp.Value == null || prop.PropertyType.IsInstanceOfType(kvp.Value))) { prop.SetValue(value, kvp.Value); } } else { PropertyInfo prop = null; try { prop = value.GetType().GetProperty(propName, flags); } catch (AmbiguousMatchException) { // Looks like we ran into a conflict between a declared property and an inherited one. // In such cases, we choose the most declared one. Type t = value.GetType(); do { prop = t.GetProperty(propName, flags | BindingFlags.DeclaredOnly); t = t.BaseType; } while(prop == null && t != null && t != typeof(object)); } if (prop != null && prop.CanWrite && (kvp.Value == null || prop.PropertyType.IsInstanceOfType(kvp.Value))) { prop.SetValue(value, kvp.Value, null); } } } } /// /// Recursive routine that creates a resource hashtable /// populated with resources for culture and all parent /// cultures. /// private SortedListFillResources(CultureInfo culture, out ResourceSet resourceSet) { SortedList sd; ResourceSet parentResourceSet = null; // Traverse parents first, so we always replace more // specific culture values with less specific. // if (!culture.Equals(CultureInfo.InvariantCulture) && !culture.Equals(NeutralResourcesCulture)) { sd = FillResources(culture.Parent, out parentResourceSet); } else { // We're at the bottom, so create the sorted dictionary // if (IgnoreCase) { sd = new SortedList (StringComparer.OrdinalIgnoreCase); } else { sd = new SortedList (StringComparer.Ordinal); } } // Now walk culture's resource set. Another thing we // do here is ask ResourceManager to traverse up the // parent chain. We do NOT want to do this because // we are trawling up the parent chain ourselves, but by // passing in true for the second parameter the resource // manager will cache the culture it did find, so when we // do recurse all missing resources will be filled in // so we are very fast. That's why we remember what our // parent resource set's instance was -- if they are the // same, we're looking at a cache we've already applied. // resourceSet = GetResourceSet(culture, true, true); if (resourceSet != null && !object.ReferenceEquals(resourceSet, parentResourceSet)) { foreach(DictionaryEntry de in resourceSet) { sd[(string)de.Key] = de.Value; } } return sd; } } } // 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
- DefaultTextStoreTextComposition.cs
- ColumnResult.cs
- QueryCacheManager.cs
- HwndHostAutomationPeer.cs
- ProcessHostMapPath.cs
- WriteTimeStream.cs
- TextTreeTextNode.cs
- FixedHyperLink.cs
- MessageQueuePermissionEntry.cs
- TargetPerspective.cs
- FixedSOMPageElement.cs
- BuiltInPermissionSets.cs
- TransportConfigurationTypeElementCollection.cs
- ToolStripDesignerAvailabilityAttribute.cs
- FeatureAttribute.cs
- CircleHotSpot.cs
- FixedStringLookup.cs
- figurelengthconverter.cs
- UInt32.cs
- BufferBuilder.cs
- Boolean.cs
- FontDialog.cs
- _NetworkingPerfCounters.cs
- ConvertersCollection.cs
- DynamicQueryStringParameter.cs
- CompoundFileIOPermission.cs
- Crypto.cs
- FontDialog.cs
- XmlAtomErrorReader.cs
- XhtmlMobileTextWriter.cs
- RegisteredHiddenField.cs
- XmlDocumentFragment.cs
- ComplexTypeEmitter.cs
- XmlSchemaSimpleContentRestriction.cs
- IsolatedStorageFile.cs
- QueryableDataSourceEditData.cs
- Parsers.cs
- TemplatedWizardStep.cs
- WebResourceUtil.cs
- ConditionCollection.cs
- TCEAdapterGenerator.cs
- TableHeaderCell.cs
- LinearKeyFrames.cs
- Timer.cs
- Table.cs
- BStrWrapper.cs
- ManipulationVelocities.cs
- ModuleElement.cs
- WebSysDisplayNameAttribute.cs
- DocumentPaginator.cs
- HiddenField.cs
- ServiceBusyException.cs
- SqlParameterCollection.cs
- ConfigurationException.cs
- Normalizer.cs
- PrefixHandle.cs
- FontSourceCollection.cs
- ExpressionList.cs
- VectorAnimationUsingKeyFrames.cs
- ConfigXmlComment.cs
- CodeArrayIndexerExpression.cs
- StackOverflowException.cs
- FileSystemInfo.cs
- DataContractSerializerSection.cs
- PersistenceTypeAttribute.cs
- QuadraticBezierSegment.cs
- ConnectionPoolManager.cs
- Size.cs
- ColorTranslator.cs
- InheritanceContextChangedEventManager.cs
- ToolStripActionList.cs
- EdmRelationshipRoleAttribute.cs
- ApplicationGesture.cs
- base64Transforms.cs
- ValidationException.cs
- WindowsRegion.cs
- MergeLocalizationDirectives.cs
- ContentDisposition.cs
- X509ServiceCertificateAuthenticationElement.cs
- GridViewDeleteEventArgs.cs
- StrokeCollectionDefaultValueFactory.cs
- ByteStreamGeometryContext.cs
- UncommonField.cs
- SafeFileMapViewHandle.cs
- BidOverLoads.cs
- cryptoapiTransform.cs
- ByteAnimationUsingKeyFrames.cs
- CertificateManager.cs
- Math.cs
- FramingDecoders.cs
- ApplicationFileCodeDomTreeGenerator.cs
- TwoPhaseCommit.cs
- ObjectSet.cs
- SoapCodeExporter.cs
- EntitySqlQueryCacheKey.cs
- ProfileSection.cs
- TaskExceptionHolder.cs
- AttachedPropertyBrowsableAttribute.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- OutputCacheProfile.cs