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
- ToolboxComponentsCreatingEventArgs.cs
- TableCellAutomationPeer.cs
- BinaryOperationBinder.cs
- GACMembershipCondition.cs
- BaseCodeDomTreeGenerator.cs
- CodeCompileUnit.cs
- XmlComplianceUtil.cs
- WebPartConnectionsEventArgs.cs
- DataControlFieldHeaderCell.cs
- ConsoleCancelEventArgs.cs
- Pens.cs
- Wrapper.cs
- DbDeleteCommandTree.cs
- HashSetDebugView.cs
- IProvider.cs
- CategoryAttribute.cs
- Point3DConverter.cs
- HtmlInputCheckBox.cs
- ChangeDirector.cs
- AsynchronousChannel.cs
- WindowInteractionStateTracker.cs
- ResXResourceReader.cs
- Geometry.cs
- FixedDSBuilder.cs
- FragmentQueryKB.cs
- RequiredAttributeAttribute.cs
- elementinformation.cs
- BCryptNative.cs
- SessionPageStateSection.cs
- PropertyGeneratedEventArgs.cs
- XPathNodeHelper.cs
- BinaryWriter.cs
- Int32Storage.cs
- DataGridPagerStyle.cs
- RemotingException.cs
- WindowsFormsLinkLabel.cs
- unitconverter.cs
- ArrayTypeMismatchException.cs
- FrameworkContentElement.cs
- CodeDOMProvider.cs
- GeneratedView.cs
- DESCryptoServiceProvider.cs
- ResourcePermissionBase.cs
- FileSecurity.cs
- TreeViewHitTestInfo.cs
- ThemeInfoAttribute.cs
- AsyncPostBackErrorEventArgs.cs
- BinHexEncoding.cs
- METAHEADER.cs
- RijndaelManaged.cs
- MasterPageCodeDomTreeGenerator.cs
- ReturnValue.cs
- FormViewPageEventArgs.cs
- NumericUpDownAcceleration.cs
- ConsumerConnectionPoint.cs
- ReferencedType.cs
- StateManagedCollection.cs
- HorizontalAlignConverter.cs
- ToolStripDropDownClosingEventArgs.cs
- ChannelReliableSession.cs
- GridView.cs
- WriteableBitmap.cs
- XmlSchemaSimpleTypeRestriction.cs
- DeviceSpecificChoice.cs
- RuntimeVariablesExpression.cs
- Stream.cs
- WebBrowsableAttribute.cs
- ClaimComparer.cs
- FreeFormDesigner.cs
- TrustSection.cs
- AlternateViewCollection.cs
- _HelperAsyncResults.cs
- XmlValueConverter.cs
- SubMenuStyle.cs
- RuleSettings.cs
- XmlSchemaObject.cs
- LinkArea.cs
- PropertyDescriptor.cs
- EFColumnProvider.cs
- TextWriterTraceListener.cs
- OdbcEnvironment.cs
- DBCSCodePageEncoding.cs
- EnterpriseServicesHelper.cs
- WCFModelStrings.Designer.cs
- EncryptedData.cs
- MetadataItemEmitter.cs
- TouchDevice.cs
- OLEDB_Util.cs
- SchemaMapping.cs
- VisualBasic.cs
- InvalidateEvent.cs
- FilteredDataSetHelper.cs
- TimeSpanValidatorAttribute.cs
- OpenFileDialog.cs
- AsyncOperation.cs
- TransactionManager.cs
- HttpRequestCacheValidator.cs
- DataGridTextBoxColumn.cs
- AutomationProperty.cs
- TimeSpanOrInfiniteConverter.cs