예제 #1
0
        /// <summary>
        /// Resolves the value to use for the node based on the parameters that were specified to the cmdlet.
        /// </summary>
        /// <returns>The values to encapsulate in a node.</returns>
        protected TValue[] ResolveValues()
        {
            var innerCmdlet = getValues();

            var set = parameterSet;

            if (set == null)
            {
                var attrib = innerCmdlet.GetType().GetCustomAttribute <CmdletAttribute>();

                if (attrib.DefaultParameterSetName == null)
                {
                    throw new NotImplementedException($"Parameter set for cmdlet {innerCmdlet.GetType().FullName} must be specified when a DefaultParameterSet is not present.");
                }
                else
                {
                    parameterSet = attrib.DefaultParameterSetName;
                }
            }

            var invoker = new PSCmdletInvoker(this, innerCmdlet, parameterSet);

            var boundParameters = GetResolverParameters();

            invoker.Invoke(boundParameters);

            var result = invoker.Output;

            var casted = result.Cast <TValue>().ToArray();

            VerifyManualResults(casted);

            return(casted);
        }
예제 #2
0
        private void ProcessHashTable()
        {
            id = StartId;

            foreach (var table in HashTable)
            {
                var dict = table.ToDictionary();

                var bindingResult = GetStaticBindingResult(dict);

                var boundParameters  = GetInvokerBoundParameters(bindingResult);
                var parameterSetName = GetInvokerParameterSetName(bindingResult);

                if (!boundParameters.ContainsKey(nameof(StartId)))
                {
                    boundParameters[nameof(StartId)] = id;
                }

                ValidateMandatoryParameters(boundParameters, parameterSetName, dict);

                var instance = new NewSensorFactoryDefinition();

                var invoker = new PSCmdletInvoker(this, instance, parameterSetName, (c, b) =>
                {
                    object s;

                    //Not all parameter sets (e.g. Manual) require a sensor!
                    if (b.TryGetValue(nameof(Sensor), out s))
                    {
                        c.Sensor = (Sensor)s;
                    }
                });

                invoker.BindParameters(boundParameters);
                invoker.BeginProcessing(boundParameters);

                if (boundParameters.ContainsKey(nameof(Sensor)))
                {
                    foreach (var sensor in summarySensors)
                    {
                        boundParameters[nameof(Sensor)] = sensor;
                        invoker.ProcessRecord(boundParameters);
                    }
                }
                else
                {
                    invoker.ProcessRecord(boundParameters);
                }

                invoker.EndProcessing();

                id = instance.id;

                foreach (var item in invoker.Output)
                {
                    WriteObject(item);
                }
            }
        }
        public PSCmdletInvoker GetInvoker(NewSensor newSensorCmdlet)
        {
            if (invoker == null && makeCmdlet != null)
            {
                invoker = new PSCmdletInvoker(newSensorCmdlet, makeCmdlet(), new Lazy <string>(() => QualifiedToUnqualifiedSetName(newSensorCmdlet.ParameterSetName)), valueFromPipeline);
            }

            return(invoker);
        }
        public bool TryGetSensorTarget(NewSensor newSensorCmdlet, PrtgClient client, ref string propertyName, ref object propertyValue)
        {
            if (alternateSet != null)
            {
                var name = propertyName;

                var matchingParameter = alternateSet.Parameters.OfType <AlternateSensorTargetParameter>().FirstOrDefault(p => p.OriginalName == name);

                //If this is true, we are processing a sensor type that had an unbound parameter ("Services") that also had a replacement
                //sensor target parameter ("ServiceName"). Invoke Get-SensorTarget using the device the sensor will be created on,
                //the type of sensor we're creating and the value that was specified for the alternate target parameter (the specified ServiceName wildcards)
                if (matchingParameter != null)
                {
                    var invoker = new PSCmdletInvoker(
                        newSensorCmdlet,
                        new GetSensorTarget(),
                        new Lazy <string>(() => ParameterSet.Default),
                        (c, b) => c.Device = (Device)b[nameof(GetSensorTarget.Device)]
                        );

                    var boundParameters = new Dictionary <string, object>();
                    boundParameters[nameof(GetSensorTarget.Type)] = Type;
                    boundParameters[nameof(GetSensorTarget.Name)] = newSensorCmdlet.MyInvocation.BoundParameters[matchingParameter.Name];

                    invoker.BindParameters(boundParameters);
                    invoker.BeginProcessing(boundParameters);
                    invoker.ProcessRecord(newSensorCmdlet.MyInvocation.BoundParameters);

                    propertyName  = matchingParameter.Name;
                    propertyValue = invoker.Output;

                    return(true);
                }
            }

            return(false);
        }