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
- CodeAttributeArgument.cs
- TypeHelpers.cs
- DebugController.cs
- CloseCryptoHandleRequest.cs
- IpcPort.cs
- StrictAndMessageFilter.cs
- NamespaceTable.cs
- MouseGestureValueSerializer.cs
- Scripts.cs
- DataGridViewBindingCompleteEventArgs.cs
- localization.cs
- COM2ComponentEditor.cs
- XmlNodeComparer.cs
- WindowsTooltip.cs
- TextFormatter.cs
- TypedElement.cs
- FtpCachePolicyElement.cs
- _KerberosClient.cs
- WebPartTransformer.cs
- ProxyWebPartManager.cs
- IRCollection.cs
- StatusBarDesigner.cs
- ToolStripPanelCell.cs
- XmlHelper.cs
- RotateTransform3D.cs
- DrawingGroup.cs
- FlowDecisionDesigner.xaml.cs
- Logging.cs
- FontEmbeddingManager.cs
- PlanCompilerUtil.cs
- BindingFormattingDialog.cs
- KoreanLunisolarCalendar.cs
- SqlServer2KCompatibilityAnnotation.cs
- MarkupCompilePass1.cs
- CallbackHandler.cs
- GifBitmapEncoder.cs
- LinkedResourceCollection.cs
- SubMenuStyleCollection.cs
- SelectorAutomationPeer.cs
- ContainerParagraph.cs
- XmlDomTextWriter.cs
- AttachInfo.cs
- UncommonField.cs
- EntityDataSourceEntityTypeFilterConverter.cs
- DependsOnAttribute.cs
- ReadContentAsBinaryHelper.cs
- DataRelationCollection.cs
- FixedFlowMap.cs
- TrackingProfileManager.cs
- ImageListUtils.cs
- EntityStoreSchemaGenerator.cs
- ControlUtil.cs
- NavigatorInput.cs
- ConfigXmlSignificantWhitespace.cs
- FilteredDataSetHelper.cs
- GeneralTransform3DTo2DTo3D.cs
- InternalPermissions.cs
- QilFunction.cs
- Renderer.cs
- DataPagerFieldCommandEventArgs.cs
- counter.cs
- DocumentViewerAutomationPeer.cs
- ScrollableControl.cs
- DataRowComparer.cs
- ProfileService.cs
- XmlNodeList.cs
- SqlRecordBuffer.cs
- DesignerAttribute.cs
- TypeCollectionPropertyEditor.cs
- Calendar.cs
- SourceChangedEventArgs.cs
- _Win32.cs
- ServerIdentity.cs
- ExecutionScope.cs
- AssemblyUtil.cs
- DrawingCollection.cs
- FunctionNode.cs
- MsmqIntegrationInputChannel.cs
- BinHexEncoder.cs
- BindingExpression.cs
- Grant.cs
- OpenFileDialog.cs
- CreateRefExpr.cs
- IconConverter.cs
- HtmlTableRow.cs
- CategoryAttribute.cs
- Pens.cs
- PasswordDeriveBytes.cs
- RawStylusInput.cs
- MenuItemBindingCollection.cs
- OdbcException.cs
- SchemaSetCompiler.cs
- ClockGroup.cs
- COM2PictureConverter.cs
- UIElementParagraph.cs
- CompressionTransform.cs
- _NTAuthentication.cs
- PageCodeDomTreeGenerator.cs
- SqlRemoveConstantOrderBy.cs
- WebExceptionStatus.cs