15

PowerShell v3.0PSCustomObjectで導入されました。のようPSObjectですが、より良いです。その他の改善 (例: プロパティの順序が維持される) の中でも、ハッシュテーブルからのオブジェクトの作成が簡素化されています。

[PSCustomObject]@{one=1; two=2;}

これで、次のステートメントは明らかなようです。

[System.Management.Automation.PSCustomObject]@{one=1; two=2;}

PSCustomObject完全な名前空間 + クラス名の「エイリアス」であるため、同じように機能します。代わりに、エラーが発生します。

タイプ "System.Collections.Hashtable" の "System.Collections.Hashtable" 値をタイプ "System.Management.Automation.PSCustomObject" に変換できません。

両方のタイプのオブジェクトのアクセラレータをリストしました。

[accelerators]::get.GetEnumerator() | where key -Like ps*object

    Key            Value
    ---            -----
    psobject       System.Management.Automation.PSObject
    pscustomobject System.Management.Automation.PSObject

そして、両方が同じクラスを参照していることを発見しました。PSObjectこれは、アクセラレータを使用すると、コードを短くするだけでなく、他の多くのことができることを意味します。

この問題に関する私の質問は次のとおりです。

  1. アクセラレータを使用する場合と完全な型名を使用する場合の違いについて、興味深い例はありますか?
  2. アクセラレータが一般的なベスト プラクティスとして利用できる場合は常に、完全な型名の使用を避けるべきですか?
  3. おそらくリフレクションを使用して、アクセラレータが基になるクラスを指す以外のことを行うかどうかを確認する方法は?
4

2 に答える 2

7

静的メソッドを見る:

PS C:\> [PSCustomObject] | gm -Static -MemberType Method



   TypeName: System.Management.Automation.PSObject

Name            MemberType Definition                                                        
----            ---------- ----------                                                        
AsPSObject      Method     static psobject AsPSObject(System.Object obj)                     
Equals          Method     static bool Equals(System.Object objA, System.Object objB)        
new             Method     psobject new(), psobject new(System.Object obj)                   
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object o...



PS C:\> [System.Management.Automation.PSCustomObject] | gm -Static -MemberType Method



   TypeName: System.Management.Automation.PSCustomObject

Name            MemberType Definition                                                        
----            ---------- ----------                                                        
Equals          Method     static bool Equals(System.Object objA, System.Object objB)        
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object o...

型アクセラレータには、いくつかの新しい静的メソッドが追加されています。それらの1つをコンストラクターとして使用していると思われます。

于 2016-03-09T14:48:27.123 に答える
4

[PSObject] と [PSCustomObject] は、同じ型 System.Management.Automation.PSObject のエイリアスです。正当な理由があるとは言えませんが、少なくとも 2 つの異なる目的を示唆しており、おそらくそれで十分な理由です。

System.Management.Automation.PSObject は、オブジェクトをラップするために使用されます。PowerShell がラップする任意のオブジェクト (.Net、WMI、COM、ADSI、または単純なプロパティ バッグ) に共通のリフレクション API を提供するために導入されました。

System.Management.Automation.PSCustomObject は単なる実装の詳細です。PSObject を作成する場合、PSObject は何かをラップする必要があります。プロパティ バッグの場合、ラップされるオブジェクトは System.Management.Automation.PSCustomObject.SelfInstance (内部メンバー) です。このインスタンスは、PowerShell の通常の使用から隠されています。それを観察する唯一の方法は、リフレクションを使用することです。

プロパティ バッグは、PowerShell で複数の方法で作成されます。

$o1 = [pscustomobject]@{Prop1 = 42}
$o2 = new-object psobject -Property @{Prop1 = 42 }

上記の $o1 と $o2 は両方とも PSObject のインスタンスになり、PSObject は PSCustomObject.SelfInstance をラップします。PSCustomObject.SelfInstance は、PowerShell の内部で使用され、単純なプロパティ バッグと他のオブジェクトのラップとの違いを示します。

于 2016-03-13T02:31:44.867 に答える