質問: [te2st]::new() ``` 結果は良好 staticメンバ も instanceメンバ もしっかりインテリセンスが使えました。 これで殆ど 目的は達成できているのですが `[te2st]`の入力時にインテリセンスが使えないので 使えるようにしたいのと Enumの例なのではclassでは可能か分からない、 一度実行しないとインテリセンスが使えない、 C#をAdd-Typeで読み込むのと一緒で ISEだと 一度読み込んでしまうと 書き換えても再起動しないと 更新できないのが難点ですが このサイトで`[MyClass.te2st]`のMyClassのように自分でNameSpace? を作ることが不可能ではない っということを知ってしまったので クラスのグループ分けが出来れば`[MyClass.`まで打ってインテリセンスを見たりすれば自分で定義したクラスが一目瞭然で しかも、もしも内容が異なる同じ名前のクラスを同時に使いたくなってもNameSpace? で分けてあれば悩む必要もなくなるだろう っということで`[MyClass.te2st]`のようにグループ分けが出来るようにしたいです。 自分でネットなどでいろいろ情報を集めているのですが、このままだと いつになったら出来るのか、そもそも出来るのかすら怪しいです。 代替策、そもそも論 等でも助かります。 宜しくお願い致します。 ### 発生している問題 前提 : クラスは再利用が前提なので別ファイルになることは避けられなさそう 1. クラスのインテリセンスが使えない (Type指定時) (ファイル名とクラス名が違ったり 一つのファイルに複数のクラスが定義されていると そのファイルを開いてクラス名を確認しないといけない) ### 補足情報(FW/ツールのバージョンなど) Win10 powerShell_ISE Ver V5 どのパソコンで作業、実行 するのか決まっていないのと 毎回全てのクラスを使うわけではない(一つのプロジェクトのみでしか利用しないのもある)ので プロファイル等 設定済みPCでしか利用できない方法は使えません。
回答: 名前空間の件ですが、class 構文で名前空間を指定する方法は見つかりませんでした。Add-Type ならありますが C# になります。 New-Enum はリフレクションで名前空間を実現しています。 補完の件ですが、ISE のエディタでも TabExpansion が使われていることを確認しました。function:\TabExpansion を書き換えれば補完の挙動を変えられますので、それでクラス名を補完するのが現実的だと思います。 現在使用可能なクラスは `[AppDomain]::CurrentDomain.GetAssemblies()|%{$_.GetTypes()}` で得ることができますが、補完のたびにこれを呼び出すのもパフォーマンスが落ちるでしょう。例えば指定したキーワードがコマンドラインにあった場合に読み直すようにするのはどうでしょうか? 追記 == 以下のスクリプトを実行することで、外部モジュールで作られたクラスが補完できることを確認しました。 なお、新クラスのアセンブリ名が `PowerShell Class Assembly` となるのは PowerShell Core の場合で、それ以前のバージョンの場合は `/powershell` のようでした。 ``` function TabExpansion { param($line, $lastWord) $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() $matchBackup = $Matches try { if ($lastBlock -match '(^\[)(.*)') { [AppDomain]::CurrentDomain.GetAssemblies() | Foreach-Object { $_.GetTypes() } | Where-Object { ($_.Name -notlike '*_') -and ($_.FullName -ilike "*$($Matches[2])*") } | ForEach-Object { '[' + $_.FullName + ']' } } } finally { $Matches = $matchBackup } } ```