about_Classes_Properties

簡単な説明

PowerShell クラスのプロパティを定義する方法について説明します。

詳細な説明

プロパティは、データを含むクラスのメンバーです。 プロパティは、クラス スコープ内で変数として宣言されます。 プロパティには、任意の組み込み型または別のクラスのインスタンスを指定できます。 クラスには、0 個以上のプロパティを指定できます。 クラスには最大プロパティ数がありません。

クラス プロパティには、非表示属性や静的属性など、任意の数の属性を含めることができます。 すべてのプロパティ定義には、プロパティの型を含める必要があります。 プロパティの既定値を定義できます。

構文

クラス プロパティでは、次の構文を使用します。

1 行構文

[[<attribute>]...] [<property-type>] $<property-name> [= <default-value>]

複数行の構文

[[<attribute>]...]
[<property-type>]
$<property-name> [= <default-value>]

例 1 - 最小限のクラス プロパティ

ExampleProject1 クラスのプロパティは、属性や既定値を指定せずに組み込みの型を使用します。

class ExampleProject1 {
    [string]   $Name
    [int]      $Size
    [bool]     $Completed
    [string]   $Assignee
    [datetime] $StartDate
    [datetime] $EndDate
    [datetime] $DueDate
}

[ExampleProject1]::new()

$null -eq ([ExampleProject1]::new()).Name
Name      :
Size      : 0
Completed : False
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

True

Name プロパティと Assignee プロパティの既定値は$null、参照型である文字列として型指定されているためです。 他のプロパティは、値型プロパティであるため、定義された型の既定値を持っています。 プロパティの既定値の詳細については、「既定のプロパティ値」を参照してください

例 2 - カスタム型を持つクラス プロパティ

ExampleProject2 の プロパティには、ExampleProject2 クラスの前に PowerShell で定義されたカスタム列挙体とクラスが まれます。

enum ProjectState {
    NotTriaged
    ReadyForWork
    Committed
    Blocked
    InProgress
    Done
}

class ProjectAssignee {
    [string] $DisplayName
    [string] $UserName

    [string] ToString() {
        return "$($this.DisplayName) ($($this.UserName))"
    }
}

class ExampleProject2 {
    [string]          $Name
    [int]             $Size
    [ProjectState]    $State
    [ProjectAssignee] $Assignee
    [datetime]        $StartDate
    [datetime]        $EndDate
    [datetime]        $DueDate
}

[ExampleProject2]@{
    Name     = 'Class Property Documentation'
    Size     = 8
    State    = 'InProgress'
    Assignee = @{
        DisplayName = 'Mikey Lombardi'
        UserName    = 'michaeltlombardi'
    }
    StartDate = '2023-10-23'
    DueDate   = '2023-10-27'
}
Name      : Class Property Documentation
Size      : 8
State     : InProgress
Assignee  : Mikey Lombardi (michaeltlombardi)
StartDate : 10/23/2023 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 10/27/2023 12:00:00 AM

例 3 - 検証属性を持つ Class プロパティ

ExampleProject3 クラスは、Size プロパティを 0 以上 16 以下の整数として定義します。 ValidateRange 属性を使用して値を制限します。

class ExampleProject3 {
                           [string]   $Name
    [ValidateRange(0, 16)] [int]      $Size
                           [bool]     $Completed
                           [string]   $Assignee
                           [datetime] $StartDate
                           [datetime] $EndDate
                           [datetime] $DueDate
}

$project = [ExampleProject3]::new()
$project
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

ExampleProject3 がインスタンス化されると、サイズ既定値は 0 になります。 有効な範囲内の値にプロパティを設定すると、値が更新されます。

$project.Size = 8
$project
Name      :
Size      : 8
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

Size が範囲外の無効な値に設定されている場合、PowerShell は例外を発生させ、値は変更されません。

$project.Size = 32
$project.Size = -1

$project
Exception setting "Size": "The 32 argument is greater than the maximum
allowed range of 16. Supply an argument that is less than or equal to 16
and then try the command again."
At line:1 char:1
+ $project.Size = 32
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationExc
   eption
    + FullyQualifiedErrorId : ExceptionWhenSetting

Exception setting "Size": "The -1 argument is less than the minimum
allowed range of 0. Supply an argument that is greater than or equal to 0
and then try the command again."
At line:1 char:1
+ $project.Size = -1
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationExc
   eption
    + FullyQualifiedErrorId : ExceptionWhenSetting

Name      :
Size      : 8
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

例 4 - 明示的な既定値を持つ Class プロパティ

ExampleProject4 クラスは、StartDate プロパティの値を現在の日付に既定で設定します。

class ExampleProject4 {
    [string]   $Name
    [int]      $Size
    [bool]     $Completed
    [string]   $Assignee
    [datetime] $StartDate = (Get-Date).Date
    [datetime] $EndDate
    [datetime] $DueDate
}

[ExampleProject4]::new()

[ExampleProject4]::new().StartDate -eq (Get-Date).Date
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 10/23/2023 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

True

例 5 - Hidden クラス プロパティ

ExampleProject5 クラスの Guid プロパティには、hiddenキーワード (keyword)があります。 Guid プロパティは、クラスの既定の出力、または返されるGet-Memberプロパティの一覧には表示されません。

class ExampleProject5 {
           [string]   $Name
           [int]      $Size
           [bool]     $Completed
           [string]   $Assignee
           [datetime] $StartDate
           [datetime] $EndDate
           [datetime] $DueDate
    hidden [string]   $Guid      = (New-Guid).Guid
}

$project = [ExampleProject5]::new()

"Project GUID: $($project.Guid)"

$project

$project | Get-Member -MemberType Properties | Format-Table
Project GUID: c72cef84-057c-4649-8940-13490dcf72f0

Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM


   TypeName: ExampleProject5

Name      MemberType Definition
----      ---------- ----------
Assignee  Property   string Assignee {get;set;}
Completed Property   bool Completed {get;set;}
DueDate   Property   datetime DueDate {get;set;}
EndDate   Property   datetime EndDate {get;set;}
Name      Property   string Name {get;set;}
Size      Property   int Size {get;set;}
StartDate Property   datetime StartDate {get;set;}

例 6 - 静的クラス プロパティ

ExampleProject6 クラスは、作成されたすべてのプロジェクトの一覧として静的な Projects プロパティを定義します。 クラスの既定のコンストラクターは、新しいインスタンスをプロジェクトの一覧に追加します。

class ExampleProject6 {
           [string]            $Name
           [int]               $Size
           [bool]              $Completed
           [string]            $Assignee
           [datetime]          $StartDate
           [datetime]          $EndDate
           [datetime]          $DueDate
    hidden [string]            $Guid     = (New-Guid).Guid
    static [ExampleProject6[]] $Projects = @()

    ExampleProject6() {
        [ExampleProject6]::Projects += $this
    }
}

"Project Count: $([ExampleProject6]::Projects.Count)"

$project1 = [ExampleProject6]@{ Name = 'Project_1' }
$project2 = [ExampleProject6]@{ Name = 'Project_2' }

[ExampleProject6]::Projects | Select-Object -Property Name, Guid
Project Count: 0

Name      Guid
----      ----
Project_1 75e7c8a0-f8d1-433a-a5be-fd7249494694
Project_2 6c501be4-e68c-4df5-8fce-e49dd8366afe

例 7 - コンストラクターでのプロパティの定義

ExampleProject7 クラスは、コマンドレットを使用して静的クラス コンストラクターの Duration スクリプト プロパティをUpdate-TypeData定義します。 PowerShell クラスの Update-TypeData 高度なプロパティを定義する唯一の方法は、または Add-Member コマンドレットを使用することです。

Duration プロパティは、StartDate プロパティと EndDate プロパティの$null両方が設定されていて、StartDate が EndDate より前に定義されていない限り、値を返します。

class ExampleProject7 {
    [string]   $Name
    [int]      $Size
    [bool]     $Completed
    [string]   $Assignee
    [datetime] $StartDate
    [datetime] $EndDate
    [datetime] $DueDate

    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberName = 'Duration'
            MemberType = 'ScriptProperty'
            Value      = {
                [datetime]$UnsetDate = 0

                $StartNotSet   = $this.StartDate -eq $UnsetDate
                $EndNotSet     = $this.EndDate   -eq $UnsetDate
                $StartAfterEnd = $this.StartDate -gt $this.EndDate

                if ($StartNotSet -or $EndNotSet -or $StartAfterEnd) {
                    return $null
                }

                return $this.EndDate - $this.StartDate
            }
        }
    )

    static ExampleProject7() {
        $TypeName = [ExampleProject7].Name
        foreach ($Definition in [ExampleProject7]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    ExampleProject7() {}

    ExampleProject7([string]$Name) {
        $this.Name = $Name
    }
}

$Project = [ExampleProject7]::new()
$Project

$null -eq $Project.Duration
Duration  :
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/0001 12:00:00 AM
EndDate   : 1/1/0001 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

True

ExampleProject7 クラスのインスタンスの既定のビューには、期間が含まれます。 StartDate プロパティと EndDate プロパティは設定されていないため、Duration プロパティは $null.

$Project.StartDate = '2023-01-01'
$Project.EndDate   = '2023-01-08'

$Project
Duration  : 7.00:00:00
Name      :
Size      : 0
Completed : False
Assignee  :
StartDate : 1/1/2023 12:00:00 AM
EndDate   : 1/8/2023 12:00:00 AM
DueDate   : 1/1/0001 12:00:00 AM

プロパティが正しく設定されている場合、 Duration プロパティは、プロジェクトの実行時間を表す期間を返します。

既定のプロパティ値

すべてのクラス プロパティには、プロパティの型に応じて暗黙的な既定値があります。

プロパティが 文字列やオブジェクトなどの参照型の場合、暗黙的な既定値は $null. プロパティが 数値、ブール値、列挙型などの値型の場合、プロパティは型に応じて既定値になります。

  • 整数や浮動小数点数などの数値型は、既定で 0
  • ブール値の既定値は $false
  • 列挙型は既定で 0、列挙型ではラベル 0が定義されていません。

.NET の既定値の詳細については、「C# 型の既定値 (C# リファレンス)」を参照してください

プロパティの明示的な既定値を定義するには、既定値への割り当てを使用してプロパティを宣言します。

たとえば、ProjectTask クラスのこの定義では、Guid プロパティの明示的な既定値が定義され、新しい各インスタンスにランダムな GUID が割り当てられます。

class ProjectTask {
    [string] $Name
    [string] $Description
    [string] $Guid = (New-Guid).Guid
}

[ProjectTask]::new()
Name Description Guid
---- ----------- ----
                 aa96350c-358d-465c-96d1-a49949219eec

非表示プロパティと静的プロパティには既定値を設定することもできます。

非表示のプロパティ

クラスのプロパティは、キーワード (keyword)でhidden宣言することで非表示にすることができます。 非表示のクラス プロパティは次のとおりです。

  • クラスの既定の出力には含まれません。
  • コマンドレットによって返されるクラス メンバーの一覧には Get-Member 含まれません。 非表示のプロパティをGet-Member表示するには、Force パラメーターを使用します。
  • 非表示のプロパティを定義するクラスで入力候補が発生しない限り、タブ補完または IntelliSense には表示されません。
  • クラスのパブリック メンバー。 アクセスして変更できます。 プロパティを非表示にしても、プライベートにはなりません。 前のポイントで説明したように、プロパティのみが非表示になります。

キーワード (keyword)のhidden詳細については、「about_Hidden」を参照してください

静的プロパティ

キーワード (keyword)を使用してプロパティを宣言することで、クラスのインスタンスではなく、クラス自体に属するプロパティstaticを定義できます。 静的クラスのプロパティ:

  • クラスのインスタンス化に関係なく、常に使用できます。
  • クラスのすべてのインスタンス間で共有されます。
  • 常に使用可能です。
  • 変更可能です。 静的プロパティは更新できます。 既定では変更できません。
  • セッションスパン全体に対してライブ。

重要

PowerShell で定義されているクラスの静的プロパティは変更できません。 次のことができます。

派生クラスのプロパティ

基底クラスから派生したクラスは、基底クラスのプロパティを継承します。 基底クラスで定義されているすべてのプロパティ (非表示のプロパティを含む) は、派生クラスで使用できます。

派生クラスは、継承されたプロパティをクラス定義で再定義することでオーバーライドできます。 派生クラスのプロパティは、再定義された型と既定値 (存在する場合) を使用します。 継承されたプロパティで既定値が定義されていて、再定義されたプロパティが定義されていない場合、継承されたプロパティには既定値はありません。

派生クラスが静的プロパティをオーバーライドしない場合、派生クラスを介して静的プロパティにアクセスすると、基底クラスの静的プロパティにアクセスします。 派生クラスを使用してプロパティ値を変更すると、基底クラスの値が変更されます。 静的プロパティをオーバーライドしないその他の派生クラスも、基底クラスのプロパティの値を使用します。 プロパティをオーバーライドしないクラスで継承された静的プロパティの値を更新すると、同じ基底クラスから派生したクラスに対して意図しない効果が発生する可能性があります。

次の例は、派生クラスの静的プロパティとインスタンス プロパティの動作を示しています。

class BaseClass {
    static [string] $StaticProperty = 'Static'
    [string] $InstanceProperty = 'Instance'
}
class DerivedClassA : BaseClass     {}
class DerivedClassB : BaseClass     {}
class DerivedClassC : DerivedClassB {
    [string] $InstanceProperty
}
class DerivedClassD : BaseClass {
    static [string] $StaticProperty = 'Override'
    [string] $InstanceProperty = 'Override'
}

"Base instance      => $([BaseClass]::new().InstanceProperty)"
"Derived instance A => $([DerivedClassA]::new().InstanceProperty)"
"Derived instance B => $([DerivedClassB]::new().InstanceProperty)"
"Derived instance C => $([DerivedClassC]::new().InstanceProperty)"
"Derived instance D => $([DerivedClassD]::new().InstanceProperty)"
Base instance      => Instance
Derived instance A => Instance
Derived instance B => Instance
Derived instance C =>
Derived instance D => Override

クラスが既定値を設定せずにプロパティを再定義したため、DerivedClassCInstanceProperty は空の文字列です。 DerivedClassD の場合、値はOverride、クラスがその文字列を既定値としてプロパティを再定義したためです。

"Base static        => $([BaseClass]::StaticProperty)"
"Derived static A   => $([DerivedClassA]::StaticProperty)"
"Derived static B   => $([DerivedClassB]::StaticProperty)"
"Derived static C   => $([DerivedClassC]::StaticProperty)"
"Derived static D   => $([DerivedClassD]::StaticProperty)"
Base static        => Static
Derived static A   => Static
Derived static B   => Static
Derived static C   => Static
Derived static D   => Override

DerivedClassD除き、派生クラスの静的プロパティの値は、プロパティを再定義しないため、基底クラスと同じです。 これは、BaseClass から直接継承するのではなく、DerivedClassB から継承される DerivedClassC にも適用されます。

[DerivedClassA]::StaticProperty = 'Updated from A'
"Base static        => $([BaseClass]::StaticProperty)"
"Derived static A   => $([DerivedClassA]::StaticProperty)"
"Derived static B   => $([DerivedClassB]::StaticProperty)"
"Derived static C   => $([DerivedClassC]::StaticProperty)"
"Derived static D   => $([DerivedClassD]::StaticProperty)"
Base static        => Updated from A
Derived static A   => Updated from A
Derived static B   => Updated from A
Derived static C   => Updated from A
Derived static D   => Override

StaticProperty が DerivedClassA を介してアクセスおよび変更されると、変更された値は DerivedClassD除くすべてのクラスに影響します。

包括的な例を含むクラス継承の詳細については、about_Classes_Inheritanceを参照してください

プロパティ属性の使用

PowerShell には、データ型情報を拡張し、プロパティに割り当てられたデータを検証するために使用できるいくつかの属性クラスが含まれています。 検証属性を使用すると、プロパティに指定された値が定義された要件を満たしていることをテストできます。 値が割り当てられた瞬間に検証がトリガーされます。

使用可能な属性の詳細については、about_Functions_Advanced_Parametersを参照してください

Update-TypeData を使用したインスタンス プロパティの定義

クラス定義でプロパティを直接宣言するだけでなく、コマンドレットを使用して静的コンストラクター内のクラスのインスタンスのプロパティを Update-TypeData 定義できます。

このスニペットは、パターンの開始点として使用します。 必要に応じて、山かっこ内のプレースホルダー テキストを置き換えます。

class <ClassName> {
    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberName = '<PropertyName>'
            MemberType = '<PropertyType>'
            Value      = <ValueDefinition>
        }
    )

    static <ClassName>() {
        $TypeName = [<ClassName>].Name
        foreach ($Definition in [<ClassName>]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }
}

ヒント

このコマンドレットは Add-Member 、非静的コンストラクターのクラスにプロパティとメソッドを追加できますが、このコマンドレットはコンストラクターが呼び出されるたびに実行されます。 静的コンストラクターで使用すると Update-TypeData 、クラスにメンバーを追加するためのコードは、セッションで 1 回だけ実行する必要があります。

読み取り専用プロパティのように、非静的コンストラクターで定義 Update-TypeDataできない場合にのみ、クラスにプロパティを追加します。

エイリアス プロパティの定義

Alias 属性は、クラス プロパティ宣言で使用しても効果はありません。 PowerShell では、その属性のみを使用して、コマンドレット、パラメーター、および関数名のエイリアスを定義します。

クラス プロパティのエイリアスを定義するには、MemberType と共にAliasProperty使用Update-TypeDataします

たとえば、OperablePair クラスのこの定義では、それぞれ LeftHandSide と RightHandSideエイリアスを持つ 2 つの整数プロパティ xy を定義します。

class OperablePair {
    [int] $x
    [int] $y

    static [hashtable[]] $MemberDefinitions = @(
            @{
                MemberType = 'AliasProperty'
                MemberName = 'LeftHandSide'
                Value      = 'x'
            }
            @{
                MemberType = 'AliasProperty'
                MemberName = 'RightHandSide'
                Value      = 'y'
            }
    )

    static OperablePair() {
        $TypeName = [OperablePair].Name
        foreach ($Definition in [OperablePair]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    OperablePair() {}

    OperablePair([int]$x, [int]$y) {
        $this.x = $x
        $this.y = $y
    }

    # Math methods for the pair of values
    [int]   GetSum()        { return $this.x + $this.y }
    [int]   GetProduct()    { return $this.x * $this.y }
    [int]   GetDifference() { return $this.x - $this.y }
    [float] GetQuotient()   { return $this.x / $this.y }
    [int]   GetModulus()    { return $this.x % $this.y }
}

エイリアスが定義されている場合、ユーザーはいずれかの名前でプロパティにアクセスできます。

$pair = [OperablePair]@{ x = 8 ; RightHandSide = 3 }

"$($pair.x) % $($pair.y) = $($pair.GetModulus())"

$pair.LeftHandSide  = 3
$pair.RightHandSide = 2
"$($pair.x) x $($pair.y) = $($pair.GetProduct())"
8 % 3 = 2

3 x 2 = 6

計算プロパティの定義

他のプロパティの値を参照するプロパティを定義するには、MemberType と共に Update-TypeData コマンドレットを ScriptProperty使用します

たとえば、Budget クラスのこの定義では、Expenses プロパティと Revenues プロパティを浮動小数点数の配列として定義します。 このコマンドレットを Update-TypeData 使用して、総経費、総収益、および当期純利益の計算プロパティを定義します。

class Budget {
    [float[]] $Expenses
    [float[]] $Revenues

    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberType = 'ScriptProperty'
            MemberName = 'TotalExpenses'
            Value      = { ($this.Expenses | Measure-Object -Sum).Sum }
        }
        @{
            MemberType = 'ScriptProperty'
            MemberName = 'TotalRevenues'
            Value      = { ($this.Revenues | Measure-Object -Sum).Sum }
        }
        @{
            MemberType = 'ScriptProperty'
            MemberName = 'NetIncome'
            Value      = { $this.TotalRevenues - $this.TotalExpenses }
        }
    )

    static Budget() {
        $TypeName = [Budget].Name
        foreach ($Definition in [Budget]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    Budget() {}

    Budget($Expenses, $Revenues) {
        $this.Expenses = $Expenses
        $this.Revenues = $Revenues
    }
}

[Budget]::new()

[Budget]@{
    Expenses = @(2500, 1931, 3700)
    Revenues = @(2400, 2100, 4150)
}
TotalExpenses : 0
TotalRevenues : 0
NetIncome     : 0
Expenses      :
Revenues      :

TotalExpenses : 8131
TotalRevenues : 8650
NetIncome     : 519
Expenses      : {2500, 1931, 3700}
Revenues      : {2400, 2100, 4150}

カスタムの取得および設定ロジックを使用したプロパティの定義

PowerShell クラスのプロパティでは、カスタム ゲッターとセッター ロジックを直接定義することはできません。 この機能を概算するには、キーワード (keyword)でhiddenバッキング プロパティを定義し、値を取得および設定するためのカスタム ロジックを使用してUpdate-TypeData表示プロパティを定義します。

慣例により、アンダースコア プレフィックスを持つ非表示のバッキング プロパティ名を定義し、キャメル ケースを使用します。 たとえば、非表示のバッキング プロパティ_taskCountTaskCount名前を付けます。

この例では、ProjectSize クラスは、_valueという名前の非表示の整数プロパティを定義します。 _value プロパティを取得および設定するためのカスタム ロジックを使用して ValueScriptProperty定義します。 setter scriptblock は、プロジェクトの文字列形式を正しいサイズに変換します。

class ProjectSize {
    hidden [ValidateSet(0, 1, 2, 3)] [int] $_value

    static [hashtable[]] $MemberDefinitions = @(
        @{
            MemberType  = 'ScriptProperty'
            MemberName  = 'Value'
            Value       = { $this._value } # Getter
            SecondValue = {                # Setter
                $ProposedValue = $args[0]

                if ($ProposedValue -is [string]) {
                    switch ($ProposedValue) {
                        'Small'  { $this._value = 1 ; break }
                        'Medium' { $this._value = 2 ; break }
                        'Large'  { $this._value = 3 ; break }
                        default  { throw "Unknown size '$ProposedValue'" }
                    }
                } else {
                    $this._value = $ProposedValue
                }
            }
        }
    )

    static ProjectSize() {
        $TypeName = [ProjectSize].Name
        foreach ($Definition in [ProjectSize]::MemberDefinitions) {
            Update-TypeData -TypeName $TypeName @Definition
        }
    }

    ProjectSize()              {}
    ProjectSize([int]$Size)    { $this.Value = $Size }
    ProjectSize([string]$Size) { $this.Value = $Size }

    [string] ToString() {
        $Output = switch ($this._value) {
            1       { 'Small'     }
            2       { 'Medium'    }
            3       { 'Large'     }
            default { 'Undefined' }
        }

        return $Output
    }
}

カスタム ゲッターとセッターを定義すると、Value プロパティを整数または文字列として設定できます。

$size = [ProjectSize]::new()
"The initial size is: $($size._value), $size"

$size.Value = 1
"The defined size is: $($size._value), $size"

$Size.Value += 1
"The updated size is: $($size._value), $size"

$Size.Value = 'Large'
"The final size is:   $($size._value), $size"
The initial size is: 0, Undefined

The defined size is: 1, Small

The updated size is: 2, Medium

The final size is:   3, Large

制限事項

PowerShell クラスのプロパティには、次の制限があります。

  • 静的プロパティは常に変更可能です。 PowerShell クラスでは、変更できない静的プロパティを定義できません。

    回避策: なし。

  • クラス プロパティ属性の引数は定数である必要があるため、プロパティでは ValidateScript 属性を使用できません。

    回避策: ValidateArgumentsAttribute 型から継承するクラスを定義し、代わりにその属性を使用します。

  • 直接宣言されたプロパティでは、カスタム getter と setter の実装を定義できません。

    回避策: 非表示のプロパティを定義し、表示されるゲッターとセッターのロジックを定義するために使用 Update-TypeData します。

  • プロパティで Alias 属性を使用することはできません。 この属性は、パラメーター、コマンドレット、関数にのみ適用されます。

    回避策: このコマンドレットを Update-TypeData 使用して、クラス コンストラクターでエイリアスを定義します。

  • コマンドレットを使用して PowerShell クラスを JSON ConvertTo-Json に変換すると、出力 JSON にはすべての非表示プロパティとその値が含まれます。

    回避策: なし

関連項目