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
- MonthChangedEventArgs.cs
- StateDesigner.TransitionInfo.cs
- DataContractAttribute.cs
- TableFieldsEditor.cs
- DataConnectionHelper.cs
- NativeMethods.cs
- DefaultCommandConverter.cs
- ProfileParameter.cs
- NonSerializedAttribute.cs
- XhtmlBasicPhoneCallAdapter.cs
- AsymmetricCryptoHandle.cs
- WebPartUserCapability.cs
- Command.cs
- PriorityQueue.cs
- ToolStripItemEventArgs.cs
- TagPrefixAttribute.cs
- GridViewCellAutomationPeer.cs
- HtmlElement.cs
- SqlDelegatedTransaction.cs
- RotateTransform.cs
- UIntPtr.cs
- LocatorPart.cs
- InternalPermissions.cs
- GenericUI.cs
- SafeNativeMethods.cs
- UrlPath.cs
- FontFaceLayoutInfo.cs
- XamlPoint3DCollectionSerializer.cs
- SocketManager.cs
- CompositeActivityTypeDescriptorProvider.cs
- BitStack.cs
- QueueException.cs
- ConsoleKeyInfo.cs
- HttpContextWrapper.cs
- UnsafeNativeMethods.cs
- VisualTreeHelper.cs
- SspiWrapper.cs
- HttpRawResponse.cs
- FormatPage.cs
- LinkClickEvent.cs
- CodeTypeReferenceExpression.cs
- CustomError.cs
- PlainXmlDeserializer.cs
- SqlBulkCopy.cs
- InfoCardRSAPKCS1SignatureDeformatter.cs
- Soap.cs
- CodeTypeReferenceCollection.cs
- DynamicObject.cs
- ProcessInputEventArgs.cs
- PatternMatcher.cs
- ColumnHeader.cs
- UnionCodeGroup.cs
- PeerNodeTraceRecord.cs
- GridViewPageEventArgs.cs
- DataGridViewLayoutData.cs
- PartitionerQueryOperator.cs
- ElementsClipboardData.cs
- QueuePropertyVariants.cs
- HelpKeywordAttribute.cs
- IgnoreDeviceFilterElementCollection.cs
- _NetRes.cs
- SessionEndingCancelEventArgs.cs
- MediaPlayerState.cs
- PartialArray.cs
- XmlAutoDetectWriter.cs
- DateTimeConverter.cs
- TemplateBaseAction.cs
- DataDocumentXPathNavigator.cs
- LoginCancelEventArgs.cs
- InvokeProviderWrapper.cs
- ParameterSubsegment.cs
- StaticResourceExtension.cs
- UnrecognizedAssertionsBindingElement.cs
- SafeNativeMethods.cs
- _NestedMultipleAsyncResult.cs
- WindowsAuthenticationEventArgs.cs
- AQNBuilder.cs
- EntityDataReader.cs
- AddInController.cs
- DynamicQueryStringParameter.cs
- basenumberconverter.cs
- DrawingCollection.cs
- Itemizer.cs
- UInt32Converter.cs
- StatusBar.cs
- SinglePageViewer.cs
- DurableInstancingOptions.cs
- UIntPtr.cs
- CounterSet.cs
- SecureStringHasher.cs
- ServiceDescriptionReflector.cs
- QueryConverter.cs
- DataComponentNameHandler.cs
- SqlXml.cs
- TextRangeEditLists.cs
- WCFBuildProvider.cs
- LicenseContext.cs
- _RequestLifetimeSetter.cs
- ListBindingConverter.cs
- DataRecordInfo.cs