しばたテックブログ

気分で書いている技術ブログです。

PowerShellで入れ子のクラス(内部クラス)を示すには + を使う話

よく忘れるので備忘録としてメモっておきます。
内容に関してはPowerShell Blogの以下の記事のままです。

blogs.msdn.microsoft.com

PowerShellで入れ子のクラス(内部クラス)を示すには + を使う

PowerShell Blogの例ではNet.WebRequestMethods.Ftpクラスを使っているので本エントリでもそのまま使います。

ソースを見ればわかりますが、このクラスはNet.WebRequestMethodsクラスの内部クラスとして定義されています。

このクラスにPowerShellからアクセスする際は

[System.Net.WebRequestMethods.Ftp]

ではなく

[System.Net.WebRequestMethods+Ftp]

+を使ってアクセスする必要があります。

f:id:stknohg:20161215215253p:plain

何故なのか?

PowerShellの仕様と言ってしまえばそれまでですが、これはリフレクションでの表記をそのまま使用しているとの事です。

例としてC#で以下のコードを呼び出すとFullNameSystem.Net.WebRequestMethods+Ftpとなることがわかります。

// C#
typeof(System.Net.WebRequestMethods.Ftp).FullName

LINQPadで確認した結果)

f:id:stknohg:20161215215822p:plain

まとめ

とりあえずこんな感じです。

この点に関してはPowerShellが悪いというよりはC#(やVB.NET)がよしなにやってくれていると捉えたほうが良いかもしれません。

ちなみにNet.WebRequestMethods.Ftpクラスの他にSystem.Environment.SpecialFolderクラスも内部クラスだったりします。
私はこっちの方をよく使うので、今回もこのクラスでハマりました...