FrameworkTemplate/Common/Plugins/PluginExtensions.cs

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace Common
{
    internal static class PluginExtensions
    {
        internal static Entity GetEntityFromContext(this IExecutionContext context)
        {
            if (context.IsRetrieveOperation() && context.OutputParameters.Contains("BusinessEntity"))
                return context.OutputParameters["BusinessEntity"] as Entity;

            if (!context.IsRetrieveOperation() && context.InputParameters.Contains("Target"))
                return context.InputParameters["Target"] as Entity;

            return null;
        }
        public static EntityReference GetEntityReferenceFromContext(this IExecutionContext context)
        {
            return new EntityReference(context.PrimaryEntityName, context.PrimaryEntityId);
        }
        public static QueryExpression GetQueryFromContext(this IPluginExecutionContext context)
        {
            if (context.InputParameters.Contains("Query"))
                return context.InputParameters["Query"] as QueryExpression;

            return null;
        }
        internal static bool IsPreValidationStage(this IPluginExecutionContext context)
        {
            return context.Stage == (int)StageEnum.PreValidation;
        }

        internal static bool IsPreOperationStage(this IPluginExecutionContext context)
        {
            return context.Stage == (int)StageEnum.PreOperation;
        }

        internal static bool IsPostOperationStage(this IPluginExecutionContext context)
        {
            return context.Stage == (int)StageEnum.PostOperation;
        }

        /// <summary>
        /// Return true when it matches the name of operation
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        internal static bool IsSetStateOperation(this IExecutionContext context, int? targetState = null)
        {
            if(string.Equals(context.MessageName, "SetState", StringComparison.InvariantCultureIgnoreCase) ||
                   string.Equals(context.MessageName, "SetStateDynamicEntity", StringComparison.InvariantCultureIgnoreCase))
            {
                if(targetState == null)
                    return true;

                return !context.IsAttributeImageEqual<OptionSetValue>("statecode", ImageHelpers.PreEntityImageName); //if it didn't change then return false as if it never changed
            }

            return false;
        }

        /// <summary>
        /// Return true when it is create operation
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        internal static bool IsCreateOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Create", StringComparison.InvariantCultureIgnoreCase);
        }

        public static bool IsAssignOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Assign", StringComparison.InvariantCultureIgnoreCase);
        }

        public static bool IsAssociateOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Associate", StringComparison.InvariantCultureIgnoreCase);
        }

        public static bool IsDisassociateOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Disassociate", StringComparison.InvariantCultureIgnoreCase);
        }

        internal static bool IsRetrieveOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Retrieve", StringComparison.InvariantCultureIgnoreCase);
        }

        /// <summary>
        /// Return true when it is update operation
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        internal static bool IsUpdateOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Update", StringComparison.InvariantCultureIgnoreCase);
        }

        /// <summary>
        /// Return true when it is delete operation
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        internal static bool IsDeleteOperation(this IExecutionContext context)
        {
            return string.Equals(context.MessageName, "Delete", StringComparison.InvariantCultureIgnoreCase);
        }

        internal static TEntity GetTarget<TEntity>(this IExecutionContext context) where TEntity : Entity
        {
            TEntity target = null;
            if (context.InputParameters.Contains("Target") &&
               context.InputParameters["Target"] is Entity _entity
               )
            {
                target = _entity.ToEntity<TEntity>();
            }
            return target;
        }
        internal static EntityReference GetTargetReference(this IExecutionContext context)
        {
            EntityReference target = null;
            if (context.InputParameters.Contains("Target") &&
               context.InputParameters["Target"] is EntityReference _entityRef
               )
            {
                target = _entityRef;
            }
            return target;
        }

        internal static TEntity GetPreImageForAction<TEntity>(this IExecutionContext context) where TEntity : Entity
        {
            TEntity PreImage = null;
            if (context.InputParameters.Contains(ImageHelpers.PreEntityImageName) &&
               context.InputParameters[ImageHelpers.PreEntityImageName] is Entity _entity
               )
            {
                PreImage = _entity.ToEntity<TEntity>();
            }
            return PreImage;
        }
    }
}