Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Print / Reach / Serialization / manager / ReachSerializationCacheItems.cs / 1 / ReachSerializationCacheItems.cs
/*++ Copyright (C) 2004- 2005 Microsoft Corporation All rights reserved. Module Name: ReachSerializationCacheItems.cs Abstract: Author: [....] ([....]) 1-December-2004 Revision History: --*/ using System; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Xml; using System.IO; using System.Security; using System.Security.Permissions; using System.ComponentModel.Design.Serialization; using System.Windows.Xps.Packaging; using System.Windows.Documents; using System.Windows.Media; using System.Windows.Markup; namespace System.Windows.Xps.Serialization { internal class TypeDependencyPropertiesCacheItem { internal TypeDependencyPropertiesCacheItem( Type type, TypeDependencyPropertyCache[] properties ) { this.objectType = type; this.serializableDependencyProperties = properties; } internal TypeDependencyPropertyCache[] GetSerializableDependencyProperties( ) { return serializableDependencyProperties; } private Type objectType; private TypeDependencyPropertyCache[] serializableDependencyProperties; }; internal class TypeCacheItem { internal TypeCacheItem( Type type ) { this.type = type; this.serializerType = null; this.typeConverter = null; clrSerializableProperties = null; } internal TypeCacheItem( Type type, Type serializerType ) { this.type = type; this.serializerType = serializerType; this.typeConverter = null; clrSerializableProperties = null; } internal TypeCacheItem( Type type, TypeConverter typeConverter ) { this.type = type; this.serializerType = null; this.typeConverter = typeConverter; clrSerializableProperties = null; } internal TypePropertyCache[] GetClrSerializableProperties( SerializersCacheManager serializersCacheManager ) { if (clrSerializableProperties == null) { PropertyInfo[] properties = type.GetProperties(); // // Separate out the serializable Clr properties // int IndexOfSerializableProperties = 0; int[] propertiesIndex = new int[properties.Length]; TypePropertyCache[] cachedProperties = new TypePropertyCache[properties.Length]; for(int indexInProperties = 0; indexInProperties < properties.Length; indexInProperties++) { PropertyInfo propertyInfo = properties[indexInProperties]; DesignerSerializationVisibility visibility = DesignerSerializationVisibility.Visible; Type serializerTypeForProperty = null; TypeConverter typeConverterForProperty = null; DefaultValueAttribute defaultValueAttr = null; DesignerSerializationOptionsAttribute designerSerializationFlagsAttr = null; if(CanSerializeProperty(propertyInfo, serializersCacheManager, out visibility, out serializerTypeForProperty, out typeConverterForProperty, out defaultValueAttr, out designerSerializationFlagsAttr) == true) { // // Figure out the Serializer or TypeConverter associated with the // type of that property. This would potentially be cached in 2 // different places // 1. The Type Cache // 2. The TypePropertyCache. // TypeCacheItem typeCacheItem = serializersCacheManager.GetTypeCacheItem(propertyInfo.PropertyType); serializerTypeForProperty = typeCacheItem.SerializerType; typeConverterForProperty = typeCacheItem.TypeConverter; // // We create a cache of this property and all the information we // deduced about it // TypePropertyCache propertyCache = new TypePropertyCache(propertyInfo, visibility, serializerTypeForProperty, typeConverterForProperty, defaultValueAttr, designerSerializationFlagsAttr); propertiesIndex[IndexOfSerializableProperties] = indexInProperties; cachedProperties[IndexOfSerializableProperties++] = propertyCache; } } clrSerializableProperties = new TypePropertyCache[IndexOfSerializableProperties]; for(int indexInClrProperties=0; indexInClrProperties < IndexOfSerializableProperties; indexInClrProperties++) { clrSerializableProperties[indexInClrProperties] = cachedProperties[indexInClrProperties]; } } return clrSerializableProperties; } internal Type SerializerType { get { return serializerType; } } internal TypeConverter TypeConverter { get { return typeConverter; } } private bool CanSerializeProperty( PropertyInfo propertyInfo, SerializersCacheManager serializersCacheManager, out DesignerSerializationVisibility visibility, out Type serializerTypeForProperty, out TypeConverter typeConverterForProperty, out DefaultValueAttribute defaultValueAttr, out DesignerSerializationOptionsAttribute designerSerializationFlagsAttr ) { bool canSerializeProperty = false; visibility = DesignerSerializationVisibility.Visible; serializerTypeForProperty = null; typeConverterForProperty = null; defaultValueAttr = null; designerSerializationFlagsAttr = null; // The conditions that we care about in those properties are as follows // 1. Readable properties // 2. None Indexable Properteis. // So we can't deal with properties that take name: Item OR // take the form this[index1, index2, ...] // 3. Properties that are not backed up by a dependency property // 4. Properties that are decorated with the DesignerSerializationVisibility // and that are not hidden // if (propertyInfo.CanRead && propertyInfo.GetIndexParameters().GetLength(0) == 0) { MemberInfo memberInfo = (MemberInfo) propertyInfo; Attribute[] attributes = Attribute.GetCustomAttributes(memberInfo); for(int numberOfAttributes = 0; numberOfAttributes < attributes.Length; numberOfAttributes++) { // // Based on the attribute type, different properties could be set // Attribute attribute = attributes[numberOfAttributes]; if (attribute is DesignerSerializationVisibilityAttribute) { visibility = ((DesignerSerializationVisibilityAttribute)attribute).Visibility; } else if (attribute is DefaultValueAttribute) { defaultValueAttr = (DefaultValueAttribute)attribute; } else if (attribute is DesignerSerializationOptionsAttribute) { designerSerializationFlagsAttr = (DesignerSerializationOptionsAttribute)attribute; } } object DependencyPropertyORPropertyInfo = DependencyProperty.FromName(propertyInfo.Name, propertyInfo.DeclaringType); if(DependencyPropertyORPropertyInfo == null && visibility != DesignerSerializationVisibility.Hidden && (propertyInfo.CanWrite || visibility == DesignerSerializationVisibility.Content)) { if(visibility != DesignerSerializationVisibility.Hidden) { canSerializeProperty = true; } } } return canSerializeProperty; } private Type type; private Type serializerType; private TypeConverter typeConverter; private TypePropertyCache[] clrSerializableProperties; }; internal class TypePropertyCache { internal TypePropertyCache( ) { } internal TypePropertyCache( PropertyInfo propertyInfo ) { if(propertyInfo == null) { throw new ArgumentNullException("propertyInfo"); } this.propertyInfo = propertyInfo; this.visibility = DesignerSerializationVisibility.Visible; this.serializerTypeForProperty = null; this.typeConverterForProperty = null; this.defaultValueAttr = null; this.designerSerializationFlagsAttr = null; this.propertyValue = null; } internal TypePropertyCache( PropertyInfo propertyInfo, DesignerSerializationVisibility visibility, Type serializerTypeForProperty, TypeConverter typeConverterForProperty, DefaultValueAttribute defaultValueAttr, DesignerSerializationOptionsAttribute designerSerializationFlagsAttr ) { if(propertyInfo == null) { throw new ArgumentNullException("propertyInfo"); } this.propertyInfo = propertyInfo; this.visibility = visibility; this.serializerTypeForProperty = serializerTypeForProperty; this.typeConverterForProperty = typeConverterForProperty; this.defaultValueAttr = defaultValueAttr; this.designerSerializationFlagsAttr = designerSerializationFlagsAttr; this.propertyValue = null; } internal DesignerSerializationVisibility Visibility { get { return visibility; } set { visibility = value; } } internal Type SerializerTypeForProperty { get { return serializerTypeForProperty; } set { serializerTypeForProperty = value; } } internal TypeConverter TypeConverterForProperty { get { return typeConverterForProperty; } set { typeConverterForProperty = value; } } internal DefaultValueAttribute DefaultValueAttr { get { return defaultValueAttr; } set { defaultValueAttr = value; } } internal DesignerSerializationOptionsAttribute DesignerSerializationOptionsAttr { get { return designerSerializationFlagsAttr; } set { designerSerializationFlagsAttr = value; } } internal PropertyInfo PropertyInfo { get { return propertyInfo; } set { propertyInfo = value; } } internal object PropertyValue { get { return propertyValue; } set { propertyValue = value; } } private DesignerSerializationVisibility visibility; private Type serializerTypeForProperty; private TypeConverter typeConverterForProperty; private DefaultValueAttribute defaultValueAttr; private DesignerSerializationOptionsAttribute designerSerializationFlagsAttr; private PropertyInfo propertyInfo; private object propertyValue; }; internal class TypeDependencyPropertyCache: TypePropertyCache { internal TypeDependencyPropertyCache( MemberInfo memberInfo, Object dependencyProperty, DesignerSerializationVisibility visibility, Type serializerTypeForProperty, TypeConverter typeConverterForProperty, DefaultValueAttribute defaultValueAttr, DesignerSerializationOptionsAttribute designerSerializationFlagsAttr ): base() { this.MemberInfo = memberInfo; this.DependencyProperty = dependencyProperty; this.PropertyInfo = memberInfo as PropertyInfo; this.Visibility = visibility; this.SerializerTypeForProperty = serializerTypeForProperty; this.TypeConverterForProperty = typeConverterForProperty; this.DefaultValueAttr = defaultValueAttr; this.DesignerSerializationOptionsAttr = designerSerializationFlagsAttr; this.PropertyValue = null; } internal static bool CanSerializeProperty( MemberInfo memberInfo, SerializersCacheManager serializersCacheManager, out DesignerSerializationVisibility visibility, out Type serializerTypeForProperty, out TypeConverter typeConverterForProperty, out DefaultValueAttribute defaultValueAttr, out DesignerSerializationOptionsAttribute designerSerializationFlagsAttr ) { bool canSerializeProperty = false; // The conditions that we care about in those properties are as follows // 1. Properties that are decorated with the DesignerSerializationVisibility // and that are not hidden // visibility = DesignerSerializationVisibility.Visible; serializerTypeForProperty = null; typeConverterForProperty = null; defaultValueAttr = null; designerSerializationFlagsAttr = null; Attribute[] attributes = Attribute.GetCustomAttributes(memberInfo); for(int numberOfAttributes = 0; numberOfAttributes < attributes.Length; numberOfAttributes++) { // // Based on the attribute type, different properties could be set // Attribute attribute = attributes[numberOfAttributes]; if (attribute is DesignerSerializationVisibilityAttribute) { visibility = ((DesignerSerializationVisibilityAttribute)attribute).Visibility; } else if (attribute is DefaultValueAttribute) { defaultValueAttr = (DefaultValueAttribute)attribute; } else if (attribute is DesignerSerializationOptionsAttribute) { designerSerializationFlagsAttr = (DesignerSerializationOptionsAttribute)attribute; } } if(visibility != DesignerSerializationVisibility.Hidden) { canSerializeProperty = true; } return canSerializeProperty; } internal static bool CanSerializeValue( object serializableObject, TypeDependencyPropertyCache propertyCache ) { bool canSerializeValue = false; // // For readonly properties check for DesignerSerializationVisibility.Content // bool isReadOnly = ((DependencyProperty)propertyCache.DependencyProperty).ReadOnly; if (isReadOnly && propertyCache.Visibility == DesignerSerializationVisibility.Content) { // // If there is a Visibility.Content attribute honor it and // populate the property value in this data structure // // DependencyObject targetDO = serializableObject as DependencyObject; propertyCache.PropertyValue = targetDO.ReadLocalValue((DependencyProperty)propertyCache.DependencyProperty); canSerializeValue = true; } else if (propertyCache.DefaultValueAttr == null) { // // Populate the property value in this data structure // DependencyObject targetDO = serializableObject as DependencyObject; propertyCache.PropertyValue = targetDO.ReadLocalValue((DependencyProperty)propertyCache.DependencyProperty); canSerializeValue = true; } else { // // Populate the property value in this data structure // as it is required to evaluate the default value // DependencyObject targetDO = serializableObject as DependencyObject; propertyCache.PropertyValue = targetDO.ReadLocalValue((DependencyProperty)propertyCache.DependencyProperty); // // For Clr properties with a DefaultValueAttribute // check if the current value equals the default // canSerializeValue = !object.Equals(propertyCache.DefaultValueAttr.Value, propertyCache.PropertyValue); if(!canSerializeValue) { propertyCache.PropertyValue = null; } } if(canSerializeValue) { if ((propertyCache.PropertyValue == null) || (propertyCache.PropertyValue == System.Windows.DependencyProperty.UnsetValue)) { canSerializeValue = false; } } return canSerializeValue; } internal MemberInfo MemberInfo { get { return memberInfo; } set { memberInfo = value; } } internal Object DependencyProperty { get { return dependencyProperty; } set { dependencyProperty = value; } } private MemberInfo memberInfo; private object dependencyProperty; }; } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- HttpCacheVary.cs
- SQLGuidStorage.cs
- ImageSourceValueSerializer.cs
- UseAttributeSetsAction.cs
- ContentFilePart.cs
- PathFigureCollection.cs
- MetadataCache.cs
- CheckBoxField.cs
- BitmapEffectInput.cs
- LinqDataSourceEditData.cs
- Expression.DebuggerProxy.cs
- SqlRowUpdatingEvent.cs
- DataTableClearEvent.cs
- MsmqIntegrationSecurity.cs
- exports.cs
- CreateParams.cs
- PagesChangedEventArgs.cs
- DataKeyArray.cs
- DataGridViewColumnConverter.cs
- IPGlobalProperties.cs
- StrokeNodeOperations.cs
- SqlBinder.cs
- TemplateColumn.cs
- SQLSingle.cs
- OpenTypeLayout.cs
- PersonalizablePropertyEntry.cs
- CompilerParameters.cs
- WebConfigurationHost.cs
- EncryptedPackageFilter.cs
- NullableConverter.cs
- SocketStream.cs
- SettingsBase.cs
- Point3DCollectionConverter.cs
- FixedSOMLineRanges.cs
- Monitor.cs
- XmlLinkedNode.cs
- DWriteFactory.cs
- GroupAggregateExpr.cs
- OleDbException.cs
- ValueTypeFixupInfo.cs
- PrinterResolution.cs
- OleServicesContext.cs
- ProcessHost.cs
- ImportFileRequest.cs
- DescendentsWalkerBase.cs
- DataGridViewComboBoxColumn.cs
- DataRelationCollection.cs
- QueryHandler.cs
- SeparatorAutomationPeer.cs
- ToolStripDropDownClosedEventArgs.cs
- FixedDocument.cs
- HandlerFactoryCache.cs
- Component.cs
- GenericEnumConverter.cs
- GenerateHelper.cs
- ComplexTypeEmitter.cs
- QueryCacheEntry.cs
- CompModSwitches.cs
- UInt16.cs
- ProfilePropertySettingsCollection.cs
- CharAnimationUsingKeyFrames.cs
- VScrollProperties.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- DataKey.cs
- Converter.cs
- IPEndPoint.cs
- BasicBrowserDialog.designer.cs
- RightsManagementEncryptionTransform.cs
- XmlHierarchicalEnumerable.cs
- StreamingContext.cs
- OdbcParameterCollection.cs
- AstNode.cs
- SchemeSettingElement.cs
- RangeContentEnumerator.cs
- DataGridViewRowCancelEventArgs.cs
- CheckPair.cs
- CompilerErrorCollection.cs
- DataBinder.cs
- XmlKeywords.cs
- SqlDataSourceFilteringEventArgs.cs
- FeatureManager.cs
- DecimalAnimationBase.cs
- UpdatableWrapper.cs
- GregorianCalendarHelper.cs
- WindowsToolbarAsMenu.cs
- StringSource.cs
- ExtensionsSection.cs
- AuthenticationModuleElementCollection.cs
- FileStream.cs
- BooleanKeyFrameCollection.cs
- InvokePattern.cs
- LinqToSqlWrapper.cs
- XslTransformFileEditor.cs
- DataGridViewToolTip.cs
- NeedSkipTokenVisitor.cs
- DateTimeOffsetStorage.cs
- DiscoveryUtility.cs
- ActivitySurrogate.cs
- QilInvokeEarlyBound.cs
- XmlDocument.cs