Tipp: Verschachtelte Klassen und private Klassen ansprechen

Der folgende Beitrag fällt in die Kategorie „Wenn man einmal zu viel Zeit hat..“, denn das Thema, um das es geht, hat mit der Alltagspraxis eines Administrators ungefähr soviel zu tun wie Siegmar Gabriel derzeit mit der Kanzlerkandidatur bei der nächsten Bundestagswahl (ok, eine politische Anspielung muss auch einmal sein;)

Der Ausgangspunkt ist ein harmloser Befehl, den jeder schon einmal eingetippt haben dürfte (vor allem, wenn er an einem meiner PowerShell-Schulungen teilgenommen hat):

Doch was genau ist PrivateData? Eine Eigenschaft vom Host-Objekt, soviel ist klar. Doch welcher Typ steckt dahinter?

Ein $Host.PrivateData.GetType().FullName liefert als Typ Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy.

Doch ein

iefert eine Fehlermeldung, diesen Typ gibt es offenbar nicht. Und was hat das + zu bedeuten? Das + steht für eine verschachtelte Klasse.

Doch auch den Typ [Microsoft.PowerShell.ConsoleHost] scheint es nicht zu geben.

Ein Blick in die zuständige Assembly mit ILSpy offfenbart, dass es sich um eine Klasse vom Typ „Sealed“ handelt, die dadurch von außen nicht zugänglich ist. Solche Typen müssen mit der GetType()-Methode angesprochen werden. Aber mit jener Varianten, die direkt über die Assembly zur Verfügung steht weil nur hier der Typenname als Argument übergeben werden kann:

Damit lässt sich der Typ abfragen:

Auch die „innere Klasse“ lässt sich auf einmal wie gewohnt ansprechen:

Damit wäre das „Geheimnis“ des +-Zeichens in einem Typenanmen gelöst. Es steht für eine Klasse, die innerhalb einer anderen Klasse definiert ist. Ist die äußere Klasse „sealed“, lässt sich der Typ nur über einen Umweg ansprechen. Praktisch ist damit nichts gewonnen, denn die Members der ConsoleColorProxy-Klasse lassen sich auch ohne diese „Verrenkungen“ direkt ansprechen. Der kleine Ausflug in die Welt der Typen sollte in erster Linie deutlich machen, warum Get-Member für die Eigenschaft PrivateData einen Typennamen liefert, den es scheinbar nicht gibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.