🐾

PowerShellのクラス定義を遅延させる

2025/01/17に公開

PowerShellでプロパティグリッドからファイルダイアログ使いたいなぁと思って
先にAdd-TypeすればFolderNameEditor属性使えんじゃねぇかなと思って試した
んだが、どーやらPowerShellのclassってパーサーの段階から特別扱いらしい

以下のようにした場合にパースエラーになる
暫く評価順変えらんないかと思って悩んだんだけどパース段階でエラーだもんね、無理無理

Add-Type -AssemblyName System.ComponentModel
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms.Design
class Sample {
    [System.ComponentModel.Editor(([System.Windows.Forms.Design.FolderNameEditor]), ([System.Drawing.Design.UITypeEditor]))] # 単体で見るとエラー
    [string] $Test
}

本題

iex先生ッよろしくお願いいたします

Add-Type -AssemblyName System.ComponentModel
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms.Design
Invoke-Expression -Command @"
class Sample {
    [System.ComponentModel.Editor(([System.Windows.Forms.Design.FolderNameEditor]), ([System.Drawing.Design.UITypeEditor]))] # 単体で見るとエラー
    [string] `$Test
}
"@

ただ残念なことにPowerShell5ではSystem.Windows.Forms.Designないんで
PowerShell7系じゃないと動かないとかゆー悲しい現実があるんです...無念
まぁ強引にパースエラーを回避することが出来るらしいのは収穫

Discussion