Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Statements / Rethrow.cs / 1305376 / Rethrow.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.Statements { using System.Activities.Runtime; using System.Activities.Validation; using System.Collections.Generic; using System.ComponentModel; public sealed class Rethrow : NativeActivity { public Rethrow() { DelegateInArgumentelement = new DelegateInArgument () { Name = "constraintArg" }; DelegateInArgument validationContext = new DelegateInArgument () { Name = "validationContext" }; base.Constraints.Add(new Constraint { Body = new ActivityAction { Argument1 = element, Argument2 = validationContext, Handler = new RethrowBuildConstraint { ParentChain = new GetParentChain { ValidationContext = validationContext, }, RethrowActivity = element }, } }); } protected override void CacheMetadata(NativeActivityMetadata metadata) { } protected override void Execute(NativeActivityContext context) { FaultContext faultContext = context.Properties.Find(TryCatch.FaultContextId) as FaultContext; if (faultContext == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.FaultContextNotFound(this.DisplayName))); } context.RethrowException(faultContext); } class RethrowBuildConstraint : NativeActivity { [RequiredArgument] [DefaultValue(null)] public InArgument > ParentChain { get; set; } [RequiredArgument] [DefaultValue(null)] public InArgument RethrowActivity { get; set; } protected override void CacheMetadata(NativeActivityMetadata metadata) { RuntimeArgument parentChainArgument = new RuntimeArgument("ParentChain", typeof(IEnumerable ), ArgumentDirection.In, true); metadata.Bind(this.ParentChain, parentChainArgument); metadata.AddArgument(parentChainArgument); RuntimeArgument rethrowActivityArgument = new RuntimeArgument("RethrowActivity", typeof(Rethrow), ArgumentDirection.In, true); metadata.Bind(this.RethrowActivity, rethrowActivityArgument); metadata.AddArgument(rethrowActivityArgument); } protected override void Execute(NativeActivityContext context) { IEnumerable parentChain = this.ParentChain.Get(context); Rethrow rethrowActivity = this.RethrowActivity.Get(context); Activity previousActivity = rethrowActivity; bool privateRethrow = false; // TryCatch with Rethrow is usually authored in the following way: // // TryCatch // { // Try = DoWork // Catch Handler = Sequence // { // ProcessException, // Rethrow // } // } // Notice that the chain of Activities is TryCatch->Sequence->Rethrow // We want to validate that Rethrow is in the catch block of TryCatch // We walk up the parent chain until we find TryCatch. Then we check if one the catch handlers points to Sequence(the previous activity in the tree) foreach (Activity parent in parentChain) { // Rethrow is only allowed under the public children of a TryCatch activity. // If any of the activities in the tree is a private child, report a constraint violation. if (parent.ImplementationChildren.Contains(previousActivity)) { privateRethrow = true; } TryCatch tryCatch = parent as TryCatch; if(tryCatch != null) { if (previousActivity != null) { foreach (Catch catchHandler in tryCatch.Catches) { ActivityDelegate catchAction = catchHandler.GetAction(); if (catchAction != null && catchAction.Handler == previousActivity) { if (privateRethrow) { Constraint.AddValidationError(context, new ValidationError(SR.RethrowMustBeAPublicChild(rethrowActivity.DisplayName), rethrowActivity)); } return; } } } } previousActivity = parent; } Constraint.AddValidationError(context, new ValidationError(SR.RethrowNotInATryCatch(rethrowActivity.DisplayName), rethrowActivity)); } } } } // 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
- Gdiplus.cs
- XpsThumbnail.cs
- X509CertificateRecipientServiceCredential.cs
- ComponentCollection.cs
- _HeaderInfoTable.cs
- DataGridViewSelectedColumnCollection.cs
- CompensatableTransactionScopeActivity.cs
- DataKeyCollection.cs
- MemoryRecordBuffer.cs
- NameScopePropertyAttribute.cs
- ReferencedAssemblyResolver.cs
- DbFunctionCommandTree.cs
- CopyOfAction.cs
- EntitySetDataBindingList.cs
- Unit.cs
- PropertyFilterAttribute.cs
- Overlapped.cs
- AutomationTextAttribute.cs
- PartialList.cs
- FormViewDeletedEventArgs.cs
- HttpStreamMessageEncoderFactory.cs
- UserControlBuildProvider.cs
- SessionStateSection.cs
- HostingMessageProperty.cs
- XmlSchemaGroup.cs
- UmAlQuraCalendar.cs
- AxHost.cs
- AccessViolationException.cs
- SpotLight.cs
- FileDetails.cs
- ISFClipboardData.cs
- HealthMonitoringSection.cs
- BaseAsyncResult.cs
- ComNativeDescriptor.cs
- DesignerDataConnection.cs
- ExpressionParser.cs
- DBCommand.cs
- EpmContentDeSerializer.cs
- RowBinding.cs
- HttpValueCollection.cs
- AutoCompleteStringCollection.cs
- StylusTouchDevice.cs
- PreDigestedSignedInfo.cs
- WindowsListViewGroup.cs
- SiteMembershipCondition.cs
- DocobjHost.cs
- Base64Stream.cs
- sqlpipe.cs
- ScriptBehaviorDescriptor.cs
- HiddenFieldPageStatePersister.cs
- NativeRecognizer.cs
- DisplayInformation.cs
- ToolZone.cs
- Clause.cs
- BitmapFrameEncode.cs
- FormViewUpdatedEventArgs.cs
- SortFieldComparer.cs
- TableLayoutStyle.cs
- ViewValidator.cs
- DropShadowBitmapEffect.cs
- RelationshipConverter.cs
- Decimal.cs
- WebPartChrome.cs
- OneOfElement.cs
- DoubleAnimationUsingPath.cs
- DeclarativeCatalogPartDesigner.cs
- LinqDataSourceSelectEventArgs.cs
- Expressions.cs
- CopyAction.cs
- AttributeProviderAttribute.cs
- MissingMethodException.cs
- RectangleGeometry.cs
- UseLicense.cs
- AggregatePushdown.cs
- ApplicationServiceManager.cs
- Utilities.cs
- EnumBuilder.cs
- SrgsGrammarCompiler.cs
- StringKeyFrameCollection.cs
- PermissionSetEnumerator.cs
- DomainUpDown.cs
- MsmqInputSessionChannel.cs
- UpdatePanel.cs
- ViewBox.cs
- AutomationElementIdentifiers.cs
- CurrencyWrapper.cs
- LineGeometry.cs
- Native.cs
- MaskedTextBox.cs
- WebPartAddingEventArgs.cs
- XmlDataFileEditor.cs
- ReadContentAsBinaryHelper.cs
- UpdateManifestForBrowserApplication.cs
- RightsManagementUser.cs
- Cloud.cs
- UIElementIsland.cs
- SimpleApplicationHost.cs
- EventRouteFactory.cs
- ScrollViewerAutomationPeer.cs
- DataBindingCollection.cs