次の方法で共有


about_Classes_Properties

簡単な説明

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

詳細な説明

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

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

構文

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

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されます。 他のプロパティは、値型プロパティであるため、定義された型の既定値を持っています。 プロパティの既定値の詳細については、「 Default プロパティ値を参照してください。

例 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 がインスタンス化されると、Sizeの既定値は 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 キーワードがあります。 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 クラスは、Update-TypeData コマンドレットを使用して静的クラス コンストラクターの Duration スクリプト プロパティを定義します。 PowerShell クラスの高度なプロパティを定義するには、 Update-TypeData または Add-Member コマンドレットを使用するしかありません。

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

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

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

非表示のプロパティ

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

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

hidden キーワードの詳細については、about_Hiddenを参照してください。

静的プロパティ

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 では、その属性のみを使用して、コマンドレット、パラメーター、および関数名のエイリアスを定義します。

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

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

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

計算プロパティの定義

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

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

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

この例では、 ProjectSize クラスは、 _valueという名前の非表示の整数プロパティを定義します。 _value プロパティを取得および設定するためのカスタム ロジックをScriptPropertyとしてValue を定義します。 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 コマンドレットを使用します。

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

    回避策: なし

関連項目