Share via


about_Classes_Properties

Kısa açıklama

PowerShell sınıfları için özelliklerin nasıl tanımlanacağı açıklanır.

Uzun açıklama

Özellikler, veri içeren sınıfın üyeleridir. Özellikler, sınıf kapsamında değişken olarak bildirilir. Bir özellik herhangi bir yerleşik türde veya başka bir sınıfın bir örneğinde olabilir. Sınıflar sıfır veya daha fazla özellik içerebilir. Sınıfların özellik sayısı üst sınırı yoktur.

Sınıf özellikleri, gizli ve statik öznitelikler de dahil olmak üzere herhangi bir sayıda öznitelik içerebilir. Her özellik tanımı özelliği için bir tür içermelidir. Bir özellik için varsayılan değer tanımlayabilirsiniz.

Sözdizimi

Sınıf özellikleri aşağıdaki söz dizimlerini kullanır:

Tek satırlık söz dizimi

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

Çok satırlı söz dizimi

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

Örnekler

Örnek 1 - En düşük sınıf özellikleri

ExampleProject1 sınıfının özellikleri, herhangi bir öznitelik veya varsayılan değer olmadan yerleşik türler kullanır.

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

Ad ve Atanan özellikleri $null için varsayılan değer, bir başvuru türü olan dize olarak yazıldığı içindir. Diğer özellikler, değer türü özellikleri olduğundan tanımlı türleri için varsayılan değere sahiptir. Özelliklerin varsayılan değerleri hakkında daha fazla bilgi için bkz . Varsayılan özellik değerleri.

Örnek 2 - Özel türleri olan sınıf özellikleri

ExampleProject2 özellikleri, ExampleProject2 sınıfından önce PowerShell'de tanımlanan özel bir numaralandırma ve sınıf içerir.

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

Örnek 3 - Doğrulama özniteliğine sahip sınıf özelliği

ExampleProject3 sınıfı, Size özelliğini 0'dan büyük veya 0'a eşit ve 16'ya eşit veya daha küçük olması gereken bir tamsayı olarak tanımlar. Değeri sınırlamak için ValidateRange özniteliğini kullanır.

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 örneği oluşturulduğunda Boyut varsayılan olarak 0'dır. özelliğinin geçerli aralık içindeki bir değere ayarlanması, değeri güncelleştirir.

$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

Boyut, aralığın dışında geçersiz bir değere ayarlandığında PowerShell bir özel durum oluşturur ve değer değiştirilmez.

$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

Örnek 4 - Açık varsayılan değere sahip sınıf özelliği

ExampleProject4 sınıfı, StartDate özelliğinin değerini geçerli tarihe varsayılan olarak alır.

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

Örnek 5 - Gizli sınıf özelliği

ExampleProject5 sınıfının Guid özelliği anahtar sözcüğüne hidden sahiptir. Guid özelliği sınıfı için varsayılan çıkışta veya tarafından Get-Memberdöndürülen özellikler listesinde gösterilmez.

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

Örnek 6 - Statik sınıf özelliği

ExampleProject6 sınıfı, statik Projeler özelliğini oluşturulan tüm projelerin listesi olarak tanımlar. sınıfı için varsayılan oluşturucu, yeni örneği projeler listesine ekler.

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

Örnek 7 - Oluşturucuda özellik tanımlama

ExampleProject7 sınıfı, cmdlet'iyle Update-TypeData statik sınıf oluşturucusunda Duration betiği özelliğini tanımlar. Update-TypeData Veya Add-Member cmdlet'ini kullanmak, PowerShell sınıfları için gelişmiş özellikleri tanımlamanın tek yoludur.

Hem StartDate hem de EndDate özellikleri ayarlanmadığı ve StartDate'ın EndDate değerinden önceki bir değer olarak tanımlanmadığı sürece Duration özelliği değerini döndürür.$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 sınıfının bir örneğinin varsayılan görünümü süreyi içerir. StartDate ve EndDate özellikleri ayarlanmamış olduğundan Duration özelliği olur$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

Özellikler doğru ayarlandığında, Duration özelliği projenin ne kadar süre çalıştığını gösteren bir zaman aralığı döndürür.

Varsayılan özellik değerleri

Her sınıf özelliği, özelliğin türüne bağlı olarak örtük bir varsayılan değere sahiptir.

Bir özellik bir dize veya nesne gibi bir başvuru türüyse örtük varsayılan değer olur $null. Bir özellik sayı, boole veya numaralandırma gibi bir değer türüyse, özelliğin türüne bağlı olarak varsayılan değeri vardır:

  • Tamsayılar ve kayan noktalı sayılar gibi sayısal türler varsayılan olarak 0
  • Boole değerleri varsayılan olarak $false
  • Sabit listeleri varsayılan olarak 0, sabit listesi bile için 0bir etiket tanımlamaz.

.NET'teki varsayılan değerler hakkında daha fazla bilgi için bkz . C# türlerinin varsayılan değerleri (C# başvurusu).

Bir özellik için açık bir varsayılan değer tanımlamak için, varsayılan değere atama ile özelliğini bildirin.

Örneğin, ProjectTask sınıfı için bu tanım, her yeni örneğe rastgele bir GUID atayarak Guid özelliği için açık bir varsayılan değer tanımlar.

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

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

Gizli ve statik özelliklerin varsayılan değerleri de olabilir.

Gizli özellikler

Bir sınıfın özelliklerini anahtar sözcüğüyle hidden bildirerek gizleyebilirsiniz. Gizli sınıf özellikleri şunlardır:

  • Sınıfın varsayılan çıkışına dahil değildir.
  • cmdlet'i tarafından Get-Member döndürülen sınıf üyeleri listesine dahil değildir. ile Get-Membergizli özellikleri göstermek için Force parametresini kullanın.
  • Gizli özelliği tanımlayan sınıfta tamamlanma gerçekleşmediği sürece sekme tamamlama veya IntelliSense'te görüntülenmez.
  • Sınıfın genel üyeleri. Bunlara erişilebilir ve değiştirilebilir. Bir özelliğin gizlenmesi özelliği özel yapmaz. Özelliği yalnızca önceki noktalarda açıklandığı gibi gizler.

Anahtar sözcük hakkında hidden daha fazla bilgi için bkz . about_Hidden.

Statik özellikler

bir özelliği anahtar sözcüğüyle static bildirerek sınıfın örnekleri yerine sınıfın kendisine ait olarak tanımlayabilirsiniz. Statik sınıf özellikleri:

  • Sınıf örneklemeden bağımsız olarak her zaman kullanılabilir.
  • Sınıfın tüm örnekleri arasında paylaşılır.
  • Her zaman kullanılabilir.
  • Değiştirilebilir. Statik özellikler güncelleştirilebilir. Bunlar varsayılan olarak sabit değildir.
  • Tüm oturum süresi boyunca canlı.

Önemli

PowerShell'de tanımlanan sınıfların statik özellikleri sabit değildir. Bunu yapabilir

Türetilmiş sınıf özellikleri

Bir sınıf bir temel sınıftan türetildiğinde, temel sınıfın özelliklerini devralır. Gizli özellikler de dahil olmak üzere temel sınıfta tanımlanan tüm özellikler türetilmiş sınıfta kullanılabilir.

Türetilmiş bir sınıf, devralınan bir özelliği sınıf tanımında yeniden tanımlayarak geçersiz kılabilir. Türetilmiş sınıftaki özelliği, varsa yeniden tanımlı türü ve varsayılan değeri kullanır. Devralınan özellik varsayılan bir değer tanımladıysa ve yeniden tanımlanan özellik tanımlamıyorsa, devralınan özelliğin varsayılan değeri yoktur.

Türetilmiş bir sınıf statik özelliği geçersiz kılmazsa, türetilmiş sınıf aracılığıyla statik özelliğe erişmek temel sınıfın statik özelliğine erişir. Türetilmiş sınıf aracılığıyla özellik değerinin değiştirilmesi, temel sınıftaki değeri değiştirir. Statik özelliği geçersiz kılmayan diğer türetilmiş herhangi bir sınıf da temel sınıfta özelliğinin değerini kullanır. Özelliği geçersiz kılmayan bir sınıfta devralınan statik özelliğin değerinin güncelleştirilmesi, aynı temel sınıftan türetilen sınıflar için istenmeyen etkilere neden olabilir.

Aşağıdaki örnekte türetilmiş sınıflardaki statik ve örnek özelliklerine yönelik davranış gösterilmektedir.

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

Sınıfı varsayılan bir değer ayarlamadan özelliği yeniden tanımladığından DerivedClassC için InstanceProperty boş bir dizedir. DerivedClassD için değerin nedeni, sınıfın özelliği varsayılan değer olarak bu dizeyle yeniden tanımlamasıdırOverride.

"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 dışında, türetilmiş sınıfların statik özelliğinin değeri temel sınıfla aynıdır, çünkü bunlar özelliği yeniden tanımlamaz. Bu, doğrudan BaseClass yerine DerivedClassB'dendevralan DerivedClassC için bile geçerlidir.

[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'ye DerivedClassA aracılığıyla erişildiğinde ve değiştirildiğinde, değiştirilen değer DerivedClassD dışında her sınıfı etkiler.

Kapsamlı bir örnek de dahil olmak üzere sınıf devralma hakkında daha fazla bilgi için bkz . about_Classes_Inheritance.

Özellik özniteliklerini kullanma

PowerShell, veri türü bilgilerini geliştirmek ve bir özelliğe atanan verileri doğrulamak için kullanabileceğiniz çeşitli öznitelik sınıfları içerir. Doğrulama öznitelikleri, özelliklere verilen değerlerin tanımlı gereksinimleri karşıladığını test etmenizi sağlar. Doğrulama, değer atandığı anda tetikler.

Kullanılabilir öznitelikler hakkında daha fazla bilgi için bkz . about_Functions_Advanced_Parameters.

Update-TypeData ile örnek özelliklerini tanımlama

Özellikleri doğrudan sınıf tanımında bildirmenin ötesinde, cmdlet'ini kullanarak statik oluşturucudaki bir sınıfın örneklerinin Update-TypeData özelliklerini tanımlayabilirsiniz.

Bu kod parçacığını desen için başlangıç noktası olarak kullanın. Köşeli ayraç içindeki yer tutucu metni gerektiği gibi değiştirin.

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

İpucu

Add-Member Cmdlet, statik olmayan oluşturuculardaki bir sınıfa özellik ve yöntemler ekleyebilir, ancak oluşturucu her çağrıldığında cmdlet çalıştırılır. Update-TypeData Statik oluşturucuda kullanmak, sınıfa üye ekleme kodunun oturumda yalnızca bir kez çalıştırılmasını sağlar.

Yalnızca ile tanımlanamayan Update-TypeDatastatik olmayan oluşturucularda sınıfına salt okunur özellikler gibi özellikler ekleyin.

Diğer ad özelliklerini tanımlama

Diğer Ad özniteliği, bir sınıf özelliği bildiriminde kullanıldığında hiçbir etkiye sahip değildir. PowerShell yalnızca cmdlet, parametre ve işlev adları için diğer adları tanımlamak için bu özniteliği kullanır.

Sınıf özelliği için bir diğer ad tanımlamak için MemberType ile kullanınUpdate-TypeDataAliasProperty.

Örneğin, OperablePair sınıfının bu tanımı sırasıyla LeftHandSide ve RightHandSide diğer adlarıyla x ve y tamsayı özelliklerini tanımlar.

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

Diğer adlar tanımlandığında, kullanıcılar özelliklere iki adla da erişebilir.

$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

Hesaplanan özellikleri tanımlama

Diğer özelliklerin değerlerine başvuran bir özellik tanımlamak için MemberType ile cmdlet'iniScriptProperty kullanınUpdate-TypeData.

Örneğin Budget sınıfının bu tanımı Expenses ve Revenues özelliklerini kayan noktalı sayıların dizisi olarak tanımlar. Toplam giderlerin Update-TypeData , toplam gelirlerin ve net gelirin hesaplanan özelliklerini tanımlamak için cmdlet'ini kullanır.

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}

Özel alma ve ayarlama mantığıyla özellikleri tanımlama

PowerShell sınıf özellikleri özel alıcı ve ayarlayıcı mantığını doğrudan tanımlayamaz. Anahtar sözcüğüyle hidden bir backing özelliği tanımlayarak ve değerini almak ve ayarlamak için özel mantıkla görünür bir özellik tanımlamak için komutunu kullanarak Update-TypeData bu işlevi yaklaşık olarak belirleyebilirsiniz.

Kurala göre, alt çizgi ön ekiyle gizli yedekleme özelliği adını tanımlayın ve deve büyük/küçük harflerini kullanın. Örneğin, yerine TaskCountgizli yedekleme özelliğini _taskCountolarak adlandırın.

Bu örnekte ProjectSize sınıfı, _value adlı gizli bir tamsayı özelliğini tanımlar. _value özelliğini almak ve ayarlamak için Özel mantık ile Değeri olarak ScriptProperty tanımlar. Ayarlayıcı betik bloğu, projenin dize gösterimini doğru boyuta dönüştürmeyi işler.

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

Özel alıcı ve ayarlayıcı tanımlandığında, Value özelliğini tamsayı veya dize olarak ayarlayabilirsiniz.

$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

Sınırlamalar

PowerShell sınıf özellikleri aşağıdaki sınırlamalara sahiptir:

  • Statik özellikler her zaman değişebilir. PowerShell sınıfları sabit statik özellikleri tanımlayamaz.

    Geçici çözüm: Yok.

  • Sınıf özelliği öznitelik bağımsız değişkenlerinin sabit olması gerektiğinden özellikler ValidateScript özniteliğini kullanamaz.

    Geçici çözüm: ValidateArgumentsAttribute türünden devralan bir sınıf tanımlayın ve bunun yerine bu özniteliği kullanın.

  • Doğrudan bildirilen özellikler özel alıcı ve ayarlayıcı uygulamaları tanımlayamaz.

    Geçici çözüm: Gizli bir özellik tanımlayın ve görünür alıcı ve ayarlayıcı mantığını tanımlamak için kullanın Update-TypeData .

  • Özellikler Diğer Ad özniteliğini kullanamaz. özniteliği yalnızca parametreler, cmdlet'ler ve işlevler için geçerlidir.

    Geçici çözüm: Sınıf oluşturucularında diğer adları tanımlamak için cmdlet'ini kullanın Update-TypeData .

  • Bir PowerShell sınıfı cmdlet'i ile ConvertTo-Json JSON'a dönüştürüldüğünde, çıkış JSON'ı tüm gizli özellikleri ve değerlerini içerir.

    Geçici çözüm: Yok

Ayrıca bkz.