public CommandParameterAnalysis(InputCommand command)
        {
            // get defintion

            var definition = command.GetType().DescribeInputCommand();

            // get parameters in set - all parameters available for the active set

            ParametersInSet = definition.Parameters;
            if (!string.IsNullOrWhiteSpace(command.ActiveParameterSet))
            {
                ParametersInSet = ParametersInSet
                                  .Where(p => string.IsNullOrEmpty(p.ParameterSet) ||
                                         p.ParameterSet.Equals(command.ActiveParameterSet)).ToList();
            }

            // get missing required parameters in set - where a complete parameter node is missing for a required parameter in the current set

            MissingRequiredParameters = ParametersInSet.Where(p => p.IsRequired &&
                                                              p.PropertyInfo.GetValue(command) == null).ToList();

            // get superflous parameters - where at least a named parameter switch is defined for a parameter that is not included in the current set

            SuperflousParameters = definition.Parameters.Where(p => p.PropertyInfo.GetValue(command) != null &&
                                                               !ParametersInSet.Contains(p)).ToList();

            // get available parameters in set - all remaining parameters where at least a named parameter switch has not been defined for the current set

            AvailableParameters = definition.Parameters.Where(p => p.PropertyInfo.GetValue(command) == null &&
                                                              ParametersInSet.Contains(p)).ToList();

            // get available switches

            AvaliableSwitches = definition.Switches.Where(s => !((SwitchParameter)s.PropertyInfo.GetValue(command)).IsPresent).ToList();
        }
        public CommandParameterAnalysis(CommandResolver resolver)
        {
            // get parameters in set - all parameters available for the active set

            ParametersInSet = resolver.CommandDefinition.Parameters;
            if (!string.IsNullOrEmpty(resolver.ActiveParameterSet))
            {
                ParametersInSet = ParametersInSet
                                  .Where(p => string.IsNullOrEmpty(p.ParameterSet) ||
                                         p.ParameterSet.Equals(resolver.ActiveParameterSet)).ToList();
            }

            // get missing required parameters in set - where a complete parameter node is missing for a required parameter in the current set

            List <ParameterDef> completedParameters = resolver.Nodes.Where(n => n.Parameter != null &&
                                                                           n.IsComplete).Select(n => n.Parameter).ToList();

            MissingRequiredParameters = ParametersInSet.Where(p => p.IsRequired &&
                                                              !completedParameters.Contains(p)).ToList();

            // get superflous parameters - where at least a named parameter switch is defined for a parameter that is not included in the current set

            List <ParameterDef> parameters = resolver.Nodes.Where(n => n.Parameter != null).Select(n => n.Parameter).ToList();

            SuperflousParameters = parameters.Where(p => !ParametersInSet.Contains(p)).ToList();

            // get available parameters in set - all remaining parameters where at least a named parameter switch has not been defined for the current set

            AvailableParameters = ParametersInSet.Where(p => !parameters.Contains(p)).ToList();

            // get available switches

            AvaliableSwitches = resolver.CommandDefinition.Switches
                                .Where(s => !resolver.Nodes.Where(n => n.Type == CRNodeType.Switch).Select(n => n.Switch).Contains(s))
                                .ToList();
        }