Laden...

Im Cmdlet auf private Property zugreifen?

Erstellt von toxic vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.190 Views
T
toxic Themenstarter:in
64 Beiträge seit 2010
vor 4 Jahren
Im Cmdlet auf private Property zugreifen?

Hi,

ich komme gerade nicht weiter. Es gibt ja in Powershell die Möglichkeit mit Parametersets zu arbeiten.
Wie bei Stackoverflow schön gezeigt, kann man im Script schön den aktuellen Namen des Parametersets abrufen:


switch ($PsCmdlet.ParameterSetName) {
    "FromFile_ParamSet" {

    }
    "FromUri_ParamSet" {

    }
}

Wenn ich im C# ein Cmdlet erstelle, komm ich an dieses Property aber nicht ran. Das Feld wo es steht ist private. Ich könnte jetzt natürlich mit Reflection mir den Wert auslesen, aber das kann ja nicht der Sinn der Sache sein. Habt ihr eine Idee.
Anbei ein Screenshot vom Debugger.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using System.Threading.Tasks;

namespace PowerShellModule
{
    [Cmdlet(VerbsCommon.New, "CmdletTest", DefaultParameterSetName = "ParaSet1")]
    public class NewTeamcenterSessionCmdlet : Cmdlet
    {
        [Parameter(Mandatory = true, ParameterSetName = "ParaSet1")]
        public string Parameter1 { get; set; }

        [Parameter(Mandatory = true, ParameterSetName = "ParaSet2")]
        public string Parameter2 { get; set; }


        protected override void BeginProcessing()
        {
            WriteVerbose("BeginProcessing");
        }

        protected override void ProcessRecord()
        {
            WriteVerbose("ProcessRecord");            
        }

        protected override void EndProcessing()
        {
            WriteVerbose("EndProcessing");
        }

        protected override void StopProcessing()
        {
            WriteVerbose("StopProcessing");
        }
    }
}
T
toxic Themenstarter:in
64 Beiträge seit 2010
vor 4 Jahren

So würde es mit Reflection funktionieren:

var setName = this.GetType().GetProperty("_ParameterSetName", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this).ToString();
T
toxic Themenstarter:in
64 Beiträge seit 2010
vor 4 Jahren

So für die Nachwelt hier die Lösung;

Es gibt zwei verschiedene Basisklassen um ein Cmdlet zu erstellen. (Cmdlet und PSCmdlet)

Kleine Beschreibung siehe hier.

Wenn man also von PSCmldet erbt, und nicht so wie ich von Cmdlet, kann man auch auf den ParameterSetName zugreifen.