about_Classes_Properties

Deskripsi singkat

Menjelaskan cara menentukan properti untuk kelas PowerShell.

Deskripsi panjang

Properti adalah anggota kelas yang berisi data. Properti dinyatakan sebagai variabel dalam cakupan kelas. Properti dapat berupa jenis bawaan atau instans kelas lain. Kelas dapat nol atau lebih properti. Kelas tidak memiliki jumlah properti maksimum.

Properti kelas dapat memiliki sejumlah atribut, termasuk atribut tersembunyi dan statis . Setiap definisi properti harus menyertakan jenis untuk properti . Anda dapat menentukan nilai default untuk properti.

Sintaks

Properti kelas menggunakan sintaks berikut:

Sintaksis satu baris

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

Sintaks multibaris

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

Contoh

Contoh 1 - Properti kelas minimal

Properti kelas ExampleProject1 menggunakan jenis bawaan tanpa atribut atau nilai default apa pun.

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

Nilai default untuk properti Nama dan Penerima Tugas adalah $null karena di ketik sebagai string, yang merupakan jenis referensi. Properti lain memiliki nilai default untuk jenis yang ditentukan, karena properti jenis nilai. Untuk informasi selengkapnya tentang nilai default untuk properti, lihat Nilai properti default.

Contoh 2 - Properti kelas dengan jenis kustom

Properti untuk ExampleProject2 menyertakan enumerasi kustom dan kelas yang ditentukan di PowerShell sebelum kelas ExampleProject2 .

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

Contoh 3 - Properti kelas dengan atribut validasi

Kelas ExampleProject3 mendefinisikan properti Ukuran sebagai bilangan bulat yang harus lebih besar dari atau sama dengan 0 dan kurang dari atau sama dengan 16. Ini menggunakan atribut ValidateRange untuk membatasi nilai.

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

Saat ExampleProject3 membuat instans, Ukuran default ke 0. Mengatur properti ke nilai dalam rentang yang valid memperbarui nilai.

$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

Saat Ukuran diatur ke nilai yang tidak valid di luar rentang, PowerShell menaikkan pengecualian dan nilai tidak diubah.

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

$project
SetValueInvocationException:
Line |
   1 |  $project.Size = 32
     |  ~~~~~~~~~~~~~~~~~~
     | 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."

SetValueInvocationException:
Line |
   2 |  $project.Size = -1
     |  ~~~~~~~~~~~~~~~~~~
     | 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."

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

Contoh 4 - Properti kelas dengan nilai default eksplisit

Kelas ExampleProject4 default nilai untuk properti StartDate ke tanggal saat ini.

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

Contoh 5 - Properti kelas tersembunyi

Properti Guid dari kelas ExampleProject5 memiliki hidden kata kunci. Properti Guid tidak ditampilkan dalam output default untuk kelas atau dalam daftar properti yang dikembalikan oleh 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;}

Contoh 6 - Properti kelas statis

Kelas ExampleProject6 mendefinisikan properti Proyek statis sebagai daftar semua proyek yang dibuat. Konstruktor default untuk kelas menambahkan instans baru ke daftar proyek.

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

Contoh 7 - Menentukan properti di konstruktor

Kelas ExampleProject7 menentukan properti skrip Durasi di konstruktor kelas statis dengan Update-TypeData cmdlet . Update-TypeData Menggunakan cmdlet atau Add-Member adalah satu-satunya cara untuk menentukan properti tingkat lanjut untuk kelas PowerShell.

Properti Durasi mengembalikan nilai $null kecuali properti StartDate dan EndDate diatur dan StartDate didefinisikan lebih awal dari 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

Tampilan default untuk instans kelas ExampleProject7 menyertakan durasi. Karena properti StartDate dan EndDate tidak diatur, properti Durasi adalah $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

Dengan properti yang diatur dengan benar, properti Durasi mengembalikan rentang waktu yang mewakili berapa lama proyek berjalan.

Nilai properti default

Setiap properti kelas memiliki nilai default implisit tergantung pada jenis properti.

Jika properti adalah jenis referensi, seperti string atau objek, nilai default implisitnya adalah $null. Jika properti adalah jenis nilai, seperti angka, boolean, atau enumerasi, properti memiliki nilai default tergantung pada jenisnya:

  • Jenis numerik, seperti bilangan bulat dan angka floating-point, default ke 0
  • Nilai Boolean default ke $false
  • Enumerasi default ke 0, bahkan enumerasi tidak menentukan label untuk 0.

Untuk informasi selengkapnya tentang nilai default di .NET, lihat Nilai default jenis C# (referensi C#).

Untuk menentukan nilai default eksplisit untuk properti, deklarasikan properti dengan penugasan ke nilai default.

Misalnya, definisi ini untuk kelas ProjectTask menentukan nilai default eksplisit untuk properti Guid , menetapkan GUID acak ke setiap instans baru.

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

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

Properti tersembunyi dan statis juga dapat memiliki nilai default.

Properti tersembunyi

Anda dapat menyembunyikan properti kelas dengan mendeklarasikannya dengan hidden kata kunci. Properti kelas tersembunyi adalah:

  • Tidak disertakan dalam output default untuk kelas .
  • Tidak termasuk dalam daftar anggota kelas yang Get-Member dikembalikan oleh cmdlet. Untuk menampilkan properti tersembunyi dengan Get-Member, gunakan parameter Paksa .
  • Tidak ditampilkan dalam penyelesaian tab atau IntelliSense kecuali penyelesaian terjadi di kelas yang menentukan properti tersembunyi.
  • Anggota publik kelas. Mereka dapat diakses dan dimodifikasi. Menyembunyikan properti tidak membuatnya privat. Ini hanya menyembunyikan properti seperti yang dijelaskan di poin sebelumnya.

Untuk informasi selengkapnya tentang hidden kata kunci, lihat about_Hidden.

Properti statis

Anda dapat menentukan properti sebagai milik kelas itu sendiri alih-alih instans kelas dengan mendeklarasikan properti dengan static kata kunci. Properti kelas statis:

  • Selalu tersedia, independen dari instansiasi kelas.
  • Dibagikan di semua instans kelas.
  • Selalu tersedia.
  • Dapat dimodifikasi. Properti statis dapat diperbarui. Mereka tidak dapat diubah secara default.
  • Hidup untuk seluruh rentang sesi.

Penting

Properti statis untuk kelas yang ditentukan di PowerShell tidak dapat diubah. Mereka bisa

Properti kelas turunan

Ketika kelas berasal dari kelas dasar, kelas tersebut mewarisi properti kelas dasar. Properti apa pun yang ditentukan pada kelas dasar, termasuk properti tersembunyi, tersedia di kelas turunan.

Kelas turunan dapat mengambil alih properti yang diwariskan dengan mendefinisikannya kembali dalam definisi kelas. Properti pada kelas turunan menggunakan jenis yang ditentukan ulang dan nilai default, jika ada. Jika properti yang diwariskan menentukan nilai default dan properti yang ditentukan ulang tidak, properti yang diwariskan tidak memiliki nilai default.

Jika kelas turunan tidak mengambil alih properti statis, mengakses properti statis melalui kelas turunan mengakses properti statis kelas dasar. Memodifikasi nilai properti melalui kelas turunan memodifikasi nilai pada kelas dasar. Kelas turunan lainnya yang tidak mengambil alih properti statis juga menggunakan nilai properti pada kelas dasar. Memperbarui nilai properti statis yang diwariskan di kelas yang tidak mengambil alih properti mungkin memiliki efek yang tidak diinginkan untuk kelas yang berasal dari kelas dasar yang sama.

Contoh berikut menunjukkan perilaku untuk properti statis dan instans pada kelas turunan.

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

InstanceProperty untuk DerivedClassC adalah string kosong karena kelas mendefinisikan ulang properti tanpa mengatur nilai default. Untuk DerivedClassD , nilainya adalah Override karena kelas mendefinisikan ulang properti dengan string tersebut sebagai nilai default.

"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

Kecuali untuk DerivedClassD, nilai properti statis untuk kelas turunan sama dengan kelas dasar, karena tidak menentukan ulang properti. Ini berlaku bahkan untuk DerivedClassC, yang mewarisi dari DerivedClassB alih-alih langsung dari BaseClass.

[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

Ketika StaticProperty diakses dan dimodifikasi melalui DerivedClassA, nilai yang diubah memengaruhi setiap kelas kecuali untuk DerivedClassD.

Untuk informasi selengkapnya tentang pewarisan kelas, termasuk contoh komprehensif, lihat about_Classes_Inheritance.

Menggunakan atribut properti

PowerShell menyertakan beberapa kelas atribut yang dapat Anda gunakan untuk meningkatkan informasi jenis data dan memvalidasi data yang ditetapkan ke properti. Atribut validasi memungkinkan Anda menguji nilai yang diberikan kepada properti memenuhi persyaratan yang ditentukan. Validasi dipicu saat nilai ditetapkan.

Untuk informasi selengkapnya tentang atribut yang tersedia, lihat about_Functions_Advanced_Parameters.

Menentukan properti instans dengan Update-TypeData

Selain mendeklarasikan properti langsung dalam definisi kelas, Anda dapat menentukan properti untuk instans kelas di konstruktor statis menggunakan Update-TypeData cmdlet.

Gunakan cuplikan ini sebagai titik awal untuk pola. Ganti teks tempat penampung dalam tanda kurung sudut sesuai kebutuhan.

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
        }
    }
}

Tip

Add-Member Cmdlet dapat menambahkan properti dan metode ke kelas dalam konstruktor non-statis, tetapi cmdlet dijalankan setiap kali konstruktor dipanggil. Menggunakan Update-TypeData dalam konstruktor statis memastikan bahwa kode untuk menambahkan anggota ke kelas hanya perlu berjalan sekali dalam sesi.

Hanya tambahkan properti ke kelas di konstruktor non-statis saat tidak dapat didefinisikan dengan Update-TypeData, seperti properti baca-saja.

Menentukan properti alias

Atribut Alias tidak berpengaruh saat digunakan pada deklarasi properti kelas. PowerShell hanya menggunakan atribut tersebut untuk menentukan alias untuk cmdlet, parameter, dan nama fungsi.

Untuk menentukan alias untuk properti kelas, gunakan Update-TypeData dengan AliasPropertyMemberType.

Misalnya, definisi kelas OperablePair ini mendefinisikan dua properti bilangan bulat x dan y dengan alias LeftHandSide dan RightHandSide masing-masing.

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 }
}

Dengan alias yang ditentukan, pengguna dapat mengakses properti dengan salah satu nama.

$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

Menentukan properti terhitung

Untuk menentukan properti yang mereferensikan nilai properti lain, gunakan Update-TypeData cmdlet dengan ScriptPropertyMemberType.

Misalnya, definisi kelas Anggaran ini mendefinisikan properti Pengeluaran dan Pendapatan sebagai array angka floating-point. Ini menggunakan Update-TypeData cmdlet untuk menentukan properti terhitung untuk total pengeluaran, total pendapatan, dan pendapatan bersih.

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}

Menentukan properti dengan logika get dan set kustom

Properti kelas PowerShell tidak dapat menentukan logika getter dan setter kustom secara langsung. Anda dapat memperkirakan fungsionalitas ini dengan menentukan properti pencadangan dengan hidden kata kunci dan menggunakan Update-TypeData untuk menentukan properti yang terlihat dengan logika kustom untuk mendapatkan dan mengatur nilai.

Menurut konvensi, tentukan nama properti backing tersembunyi dengan awalan garis bawah dan gunakan casing camel. Misalnya, alih-alih TaskCount, beri nama properti _taskCountbacking tersembunyi .

Dalam contoh ini, kelas ProjectSize mendefinisikan properti bilangan bulat tersembunyi bernama _value. Ini mendefinisikan Nilai sebagai ScriptProperty dengan logika kustom untuk mendapatkan dan mengatur properti _value . Blok skrip setter menangani konversi representasi string proyek ke ukuran yang benar.

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
    }
}

Dengan getter dan setter kustom yang ditentukan, Anda dapat mengatur properti Nilai sebagai bilangan bulat atau string.

$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

Batasan

Properti kelas PowerShell memiliki batasan berikut:

  • Properti statis selalu dapat diubah. Kelas PowerShell tidak dapat menentukan properti statis yang tidak dapat diubah.

    Penanganan masalah: Tidak ada.

  • Properti tidak dapat menggunakan atribut ValidateScript , karena argumen atribut properti kelas harus konstanta.

    Solusi sementara: Tentukan kelas yang mewarisi dari jenis ValidateArgumentsAttribute dan gunakan atribut tersebut sebagai gantinya.

  • Properti yang dideklarasikan secara langsung tidak dapat menentukan implementasi getter dan setter kustom.

    Solusi sementara: Tentukan properti tersembunyi dan gunakan Update-TypeData untuk menentukan logika getter dan setter yang terlihat.

  • Properti tidak dapat menggunakan atribut Alias . Atribut hanya berlaku untuk parameter, cmdlet, dan fungsi.

    Solusi sementara: Gunakan Update-TypeData cmdlet untuk menentukan alias di konstruktor kelas.

  • Saat kelas PowerShell dikonversi ke JSON dengan ConvertTo-Json cmdlet, JSON output menyertakan semua properti tersembunyi dan nilainya.

    Solusi sementara: Tidak ada

Lihat juga