private void AddOrDeleteChanging(ComposablePartCatalogChangeEventArgs changeArgs, Action addDeleteAction, bool added)
        {
            bool changeException = false;
            ChangeRejectedException changeRejectedException = null;
            string failureDetails       = null;
            bool   recompositionSuccess = false;
            RecompositionEventReason recompositionEventReason = RecompositionEventReason.Deleted;

            try
            {
                Changing?.Invoke(this, changeArgs);
            }
            catch (ChangeRejectedException exc)
            {
                failureDetails  = GetChangeRejectedExceptionMessage(exc);
                changeException = true;
            }

            addDeleteAction();
            Changed?.Invoke(this, changeArgs);

            if (!changeException)
            {
                recompositionSuccess = true;
            }
            else
            {
                RecompositionException(changeRejectedException);
            }
            if (added)
            {
                recompositionEventReason = RecompositionEventReason.Added;
            }

            RecompositionAttemptEvent?.Invoke(this, new RecompositionAttemptEventArgs(recompositionSuccess, recompositionEventReason, failureDetails));
        }
 internal RecompositionAttemptEventArgs(bool success, RecompositionEventReason reason, string failureDetails)
 {
     Success        = success;
     Reason         = reason;
     FailureDetails = failureDetails;
 }