Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Serializer / DictionarySurrogate.cs / 1305376 / DictionarySurrogate.cs
namespace System.Workflow.ComponentModel.Serialization { using System; using System.Xml; using System.Runtime.Serialization; using System.Reflection; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Collections; using System.Collections.Generic; #region DictionarySurrogate internal sealed class DictionarySurrogate : ISerializationSurrogate { void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context) { if (!obj.GetType().IsGenericType || obj.GetType().GetGenericTypeDefinition() != typeof(Dictionary<,>)) throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj"); Type[] args = obj.GetType().GetGenericArguments(); if (args.Length != 2) throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj"); PropertyInfo keysProperty = obj.GetType().GetProperty("Keys"); if (keysProperty == null) throw new NullReferenceException("keysProperty"); ArrayList keys = new ArrayList(keysProperty.GetValue(obj, null) as ICollection); PropertyInfo valuesProperty = obj.GetType().GetProperty("Values"); if (valuesProperty == null) throw new NullReferenceException("valuesProperty"); ArrayList values = new ArrayList(valuesProperty.GetValue(obj, null) as ICollection); if (keys.Count == 1) { info.AddValue("key", keys[0]); info.AddValue("value", values[0]); } else if (keys.Count > 1) { info.AddValue("keys", keys.ToArray()); info.AddValue("values", values.ToArray()); } info.AddValue("keyType", args[0]); info.AddValue("valueType", args[1]); info.SetType(typeof(DictionaryRef)); } object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { return null; } #region DictionaryRef [Serializable] private sealed class DictionaryRef : IObjectReference, IDeserializationCallback { [OptionalField] private IList keys = null; [OptionalField] private IList values = null; [OptionalField] private object key = null; [OptionalField] private object value = null; private Type keyType = null; private Type valueType = null; [NonSerialized] private object dictionary = null; Object IObjectReference.GetRealObject(StreamingContext context) { if (this.dictionary == null) { Type dictionaryType = typeof(Dictionary).GetGenericTypeDefinition().MakeGenericType(keyType, valueType); this.dictionary = dictionaryType.GetConstructor(Type.EmptyTypes).Invoke(null); } return this.dictionary; } void IDeserializationCallback.OnDeserialization(Object sender) { if (this.dictionary != null) { MethodInfo addMethod = this.dictionary.GetType().GetMethod("Add"); if (addMethod == null) throw new NullReferenceException("addMethod"); object[] kvp = new object[2]; if (this.keys != null) { for (int index = 0; index < this.keys.Count; index++) { kvp[0] = this.keys[index]; kvp[1] = this.values[index]; addMethod.Invoke(this.dictionary, kvp); } } else if (this.key != null) { kvp[0] = this.key; kvp[1] = this.value; addMethod.Invoke(this.dictionary, kvp); } } this.dictionary = null; } } #endregion } #endregion } // 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
- RemoteDebugger.cs
- iisPickupDirectory.cs
- JulianCalendar.cs
- SoapAttributeOverrides.cs
- CharacterHit.cs
- TypeUsage.cs
- SmiRequestExecutor.cs
- XmlAttributeCache.cs
- ButtonBaseAutomationPeer.cs
- InvalidFilterCriteriaException.cs
- DateBoldEvent.cs
- ExternalDataExchangeService.cs
- ResourceManagerWrapper.cs
- XomlCompilerHelpers.cs
- CancellationTokenRegistration.cs
- OutputCacheModule.cs
- NetPeerTcpBindingCollectionElement.cs
- SqlXmlStorage.cs
- DbProviderManifest.cs
- PeerPresenceInfo.cs
- RelationshipSet.cs
- OleDbCommandBuilder.cs
- PointCollection.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- recordstatescratchpad.cs
- infer.cs
- ExtensionWindowHeader.cs
- NamespaceExpr.cs
- UDPClient.cs
- XmlQueryStaticData.cs
- XamlDesignerSerializationManager.cs
- DataProtection.cs
- WSDualHttpBindingElement.cs
- PageOrientation.cs
- ThreadBehavior.cs
- DbMetaDataFactory.cs
- GridViewColumnHeaderAutomationPeer.cs
- ToolStripSeparatorRenderEventArgs.cs
- Rotation3D.cs
- Stack.cs
- ChangeBlockUndoRecord.cs
- BaseDataBoundControl.cs
- StrokeCollection.cs
- StrongTypingException.cs
- XmlSchemaExporter.cs
- PositiveTimeSpanValidatorAttribute.cs
- CachedTypeface.cs
- DivideByZeroException.cs
- AnnotationComponentChooser.cs
- ObjectListField.cs
- Int64Storage.cs
- PaintValueEventArgs.cs
- ProxyHelper.cs
- PointF.cs
- XPathNodePointer.cs
- ListViewCancelEventArgs.cs
- EnumCodeDomSerializer.cs
- DependencyPropertyValueSerializer.cs
- OleAutBinder.cs
- messageonlyhwndwrapper.cs
- TypeUsageBuilder.cs
- RawAppCommandInputReport.cs
- UICuesEvent.cs
- PrintPreviewControl.cs
- ForceCopyBuildProvider.cs
- InfoCardHelper.cs
- ResolveNextArgumentWorkItem.cs
- RedistVersionInfo.cs
- BinaryExpressionHelper.cs
- WebPartTransformerCollection.cs
- Win32Exception.cs
- WebPartDesigner.cs
- XmlBufferReader.cs
- ControlDesignerState.cs
- versioninfo.cs
- DbParameterCollectionHelper.cs
- NeutralResourcesLanguageAttribute.cs
- UInt16Converter.cs
- PageThemeBuildProvider.cs
- TextSelection.cs
- Select.cs
- SpellerHighlightLayer.cs
- ContentIterators.cs
- XsltException.cs
- ActiveXSite.cs
- EdmValidator.cs
- Style.cs
- SiteMapNode.cs
- OleDbError.cs
- XmlSchemaAnyAttribute.cs
- FixedHyperLink.cs
- AuthenticationService.cs
- Rect3D.cs
- Tracer.cs
- AuthorizationRuleCollection.cs
- SmiTypedGetterSetter.cs
- DataRowChangeEvent.cs
- SecurityManager.cs
- PreApplicationStartMethodAttribute.cs
- ErrorsHelper.cs