Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx35 / System.WorkflowServices / System / Workflow / Activities / DynamicContractTypeBuilder.cs / 1305376 / DynamicContractTypeBuilder.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.Workflow.Activities { using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Drawing.Design; using System.Net.Security; using System.Reflection; using System.Reflection.Emit; using System.ServiceModel; using System.Threading; using System.Workflow.Activities.Design; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Compiler; internal static class DynamicContractTypeBuilder { internal static readonly DependencyProperty DynamicContractTypesProperty = DependencyProperty.RegisterAttached("DynamicContractTypes", typeof(Dictionary), typeof(DynamicContractTypeBuilder), new PropertyMetadata(null, DependencyPropertyOptions.NonSerialized)); public static Type GetContractType(OperationInfo operationInfo, ReceiveActivity contextActivity) { if (operationInfo == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("operationInfo"); } if (contextActivity == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contextActivity"); } if (string.IsNullOrEmpty(operationInfo.ContractName)) { return null; } Activity rootActivity = contextActivity.RootActivity; Dictionary contractTypes = rootActivity.GetValue(DynamicContractTypeBuilder.DynamicContractTypesProperty) as Dictionary ; if (contractTypes == null) { Activity definition = rootActivity.GetValue(Activity.WorkflowDefinitionProperty) as Activity; if (definition != null) { contractTypes = definition.GetValue(DynamicContractTypeBuilder.DynamicContractTypesProperty) as Dictionary ; } if (contractTypes != null) { rootActivity.SetValue(DynamicContractTypeBuilder.DynamicContractTypesProperty, contractTypes); } } if (contractTypes == null) { contractTypes = BuildContractTypes(rootActivity); rootActivity.SetValue(DynamicContractTypeBuilder.DynamicContractTypesProperty, contractTypes); } if (contractTypes.ContainsKey(operationInfo.ContractName)) { return contractTypes[operationInfo.ContractName]; } return null; } static Dictionary BuildContractTypes(Activity contextActivity) { if (contextActivity == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contextActivity"); } Dictionary types = new Dictionary (); Walker walker = new Walker(true); walker.FoundActivity += delegate(Walker w, WalkerEventArgs args) { ReceiveActivity currentActivity = args.CurrentActivity as ReceiveActivity; if (currentActivity == null) { return; } OperationInfo operationInfo = currentActivity.ServiceOperationInfo as OperationInfo; if (operationInfo == null) { return; } if (string.IsNullOrEmpty(operationInfo.ContractName) || string.IsNullOrEmpty(operationInfo.Name)) { return; } if (!types.ContainsKey(operationInfo.ContractName)) { types.Add(operationInfo.ContractName, new ContractType(operationInfo.ContractName)); } bool hasReturnValue = false; bool duplicatedPositions = false; int maxPosition = -1; List parameterIndexs = new List (); foreach (OperationParameterInfo operationParameterInfo in operationInfo.Parameters) { if (operationParameterInfo.Position == -1) { hasReturnValue = true; } else { maxPosition = (maxPosition < operationParameterInfo.Position) ? operationParameterInfo.Position : maxPosition; } if (parameterIndexs.Contains(operationParameterInfo.Position)) { duplicatedPositions = true; break; } else { parameterIndexs.Add(operationParameterInfo.Position); } } if (duplicatedPositions || maxPosition > (operationInfo.Parameters.Count - (hasReturnValue ? 2 : 1))) { return; } ContractType contract = types[operationInfo.ContractName]; ContractMethodInfo methodInfo = new ContractMethodInfo(contract, operationInfo); }; walker.Walk(contextActivity); return types; } } } // 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
- GraphicsPathIterator.cs
- DtrList.cs
- InternalConfigRoot.cs
- OleDbMetaDataFactory.cs
- PrintDocument.cs
- SiteMapDataSourceView.cs
- DataTableMapping.cs
- HttpRequest.cs
- ControlEvent.cs
- CSharpCodeProvider.cs
- UserControl.cs
- FontDialog.cs
- SoapFormatterSinks.cs
- CheckBoxPopupAdapter.cs
- XmlElementElementCollection.cs
- PaintValueEventArgs.cs
- CorePropertiesFilter.cs
- HMACRIPEMD160.cs
- CornerRadius.cs
- RegexCompiler.cs
- ProfileSettingsCollection.cs
- SQLStringStorage.cs
- MenuItem.cs
- DataGridViewColumnConverter.cs
- SimpleApplicationHost.cs
- EngineSite.cs
- RMEnrollmentPage2.cs
- ListViewGroup.cs
- DoubleAnimationClockResource.cs
- Graph.cs
- XamlReaderConstants.cs
- LocalizeDesigner.cs
- WinFormsSpinner.cs
- _CommandStream.cs
- SafeArrayRankMismatchException.cs
- StylusSystemGestureEventArgs.cs
- Run.cs
- SqlTypesSchemaImporter.cs
- DragDrop.cs
- EntityDataSourceQueryBuilder.cs
- BindingEntityInfo.cs
- _NegotiateClient.cs
- DataBindingsDialog.cs
- NavigationHelper.cs
- SafeHandles.cs
- ClientBuildManager.cs
- CredentialCache.cs
- RegisteredArrayDeclaration.cs
- GrammarBuilder.cs
- StrokeNodeData.cs
- XPathExpr.cs
- SqlBinder.cs
- ListenerConnectionModeReader.cs
- HttpApplicationFactory.cs
- ICspAsymmetricAlgorithm.cs
- TextViewSelectionProcessor.cs
- SliderAutomationPeer.cs
- ContentPlaceHolder.cs
- ProgressiveCrcCalculatingStream.cs
- AttributeQuery.cs
- Interlocked.cs
- WebZone.cs
- ClientProxyGenerator.cs
- PlaceHolder.cs
- ArglessEventHandlerProxy.cs
- DebugHandleTracker.cs
- SqlMultiplexer.cs
- SqlDeflator.cs
- NativeActivityTransactionContext.cs
- NamedPermissionSet.cs
- CodeComment.cs
- FileChangesMonitor.cs
- ButtonRenderer.cs
- TableColumn.cs
- TextPointer.cs
- WebPartZone.cs
- StylusTip.cs
- Debug.cs
- SoapMessage.cs
- DataMemberConverter.cs
- ExpandCollapseProviderWrapper.cs
- WebCodeGenerator.cs
- XamlSerializer.cs
- elementinformation.cs
- TextRangeProviderWrapper.cs
- CaretElement.cs
- Tag.cs
- ParameterCollection.cs
- PlainXmlWriter.cs
- ValueType.cs
- WebPartTransformerCollection.cs
- DefaultClaimSet.cs
- RSAPKCS1SignatureFormatter.cs
- StackOverflowException.cs
- SqlFacetAttribute.cs
- TargetException.cs
- StylusPlugInCollection.cs
- InternalConfigHost.cs
- UserNamePasswordValidator.cs
- DataGridViewCellPaintingEventArgs.cs