Наследование: WorkflowBlockBase, IReleaseWorkflowBlock
        private static ReleaseAction ParseReleaseAction(XElement node)
        {
            var stageActivity = XName.Get("StageActivity", "clr-namespace:Microsoft.TeamFoundation.Release.Data.Model;assembly=Microsoft.TeamFoundation.Release.Data");
            var firstNodeDescendant = node.Descendants(stageActivity).First();
            var componentId = int.Parse(firstNodeDescendant.Attribute("ComponentId").Value);
            var workflowActivityId = Guid.Parse(firstNodeDescendant.Attribute("WorkflowActivityId").Value);
            var itemType = node.Name.LocalName == ActionActivity.LocalName
                ? BlockType.Action
                : node.Name.LocalName == ComponentActivity.LocalName ? BlockType.Component : BlockType.Undefined;

            var action = new ReleaseAction
            {
                DisplayName = node.Attribute("DisplayName").Value,
                DisplayNameIsMeaningful = true,
                Enabled = !bool.Parse(node.Attribute("IsSkipped").Value),
                ItemType = itemType,
                ComponentId = componentId,
                WorkflowActivityId = workflowActivityId
            };

            FireActionParsedEvent(action);

            return action;
        }
 private static ScriptAction CreateScriptAction(RMComponent component, ReleaseAction action)
 {
     return new ScriptAction
                {
                    Enabled = action.Enabled, 
                    DisplayName = action.DisplayName, 
                    Sequence = action.Sequence, 
                    IsComponent = action.IsComponent, 
                    DeployerToolId = component.DeployerToolId, 
                    FileExtensionFilter = component.FileExtensionFilter, 
                    Command = component.Command, 
                    Arguments = component.Arguments, 
                    VariableReplacementMethod = component.VariableReplacementMethod, 
                    ConfigurationVariables = component.ConfigurationVariables
                };
 }
 private static GenerationEventArgs GetActionGenerationArgs(ReleaseAction action, GenerationEventType eventType)
 {
     return new GenerationEventArgs
                {
                    BlockType = action.ItemType, 
                    DisplayName = action.DisplayName, 
                    Sequence = action.Sequence, 
                    IsEnabled = action.Enabled, 
                    IsContainer = false, 
                    GenerationEventType = eventType
                };
 }
 internal static void FireActionParsedEvent(ReleaseAction action)
 {
     ActionParsed?.Invoke(
         null,
         new ActionParsedEventArgs { DisplayName = action.DisplayName, ItemType = action.ItemType });
 }