Dela via


about_Classes_Properties

Kort beskrivning

Beskriver hur du definierar egenskaper för PowerShell-klasser.

Lång beskrivning

Egenskaper är medlemmar i klassen som innehåller data. Egenskaper deklareras som variabler i klassomfånget. En egenskap kan vara av valfri inbyggd typ eller en instans av en annan klass. Klasser kan noll eller fler egenskaper. Klasser har inte maximalt antal egenskaper.

Klassegenskaper kan ha valfritt antal attribut, inklusive dolda och statiska attribut. Varje egenskapsdefinition måste innehålla en typ för egenskapen. Du kan definiera ett standardvärde för en egenskap.

Syntax

Klassegenskaper använder följande syntaxer:

Enradssyntax

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

Syntax för flera ledningar

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

Exempel

Exempel 1 – Minimala klassegenskaper

Egenskaperna för klassen ExampleProject1 använder inbyggda typer utan attribut eller standardvärden.

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

Standardvärdet för egenskaperna Namn och Tilldelad beror $null på att de skrivs som strängar, vilket är en referenstyp. De andra egenskaperna har standardvärdet för sin definierade typ, eftersom de är värdetypsegenskaper. Mer information om standardvärdena för egenskaper finns i Standardegenskapsvärden.

Exempel 2 – Klassegenskaper med anpassade typer

Egenskaperna för ExampleProject2 innehåller en anpassad uppräkning och klass som definierats i PowerShell före klassen 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

Exempel 3 – Klassegenskap med ett valideringsattribut

Klassen ExampleProject3 definierar egenskapen Storlek som ett heltal som måste vara större än eller lika med 0 och mindre än eller lika med 16. Attributet ValidateRange används för att begränsa värdet.

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

När ExampleProject3 instansierar är storleken standard 0. Om du anger egenskapen till ett värde inom det giltiga intervallet uppdateras värdet.

$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

När Storlek är inställt på ett ogiltigt värde utanför intervallet genererar PowerShell ett undantag och värdet ändras inte.

$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

Exempel 4 – Klassegenskap med ett explicit standardvärde

Klassen ExampleProject4 standardvärdet för egenskapen StartDate till det aktuella datumet.

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

Exempel 5 – Egenskapen Dold klass

Guid-egenskapen för klassen ExampleProject5 har nyckelordet hidden . Guid-egenskapen visas inte i standardutdata för klassen eller i listan över egenskaper som returneras av 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;}

Exempel 6 – Statisk klassegenskap

Klassen ExampleProject6 definierar egenskapen static Projects som en lista över alla projekt som skapats. Standardkonstruktorn för klassen lägger till den nya instansen i listan över projekt.

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

Exempel 7 – Definiera en egenskap i konstruktorn

Klassen ExampleProject7 definierar egenskapen Duration script i den statiska klasskonstruktorn med cmdleten Update-TypeData . Att använda cmdleten Update-TypeData eller Add-Member är det enda sättet att definiera avancerade egenskaper för PowerShell-klasser.

Egenskapen Duration returnerar värdet $null om inte både egenskaperna StartDate och EndDate anges och StartDate definieras som tidigare än 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

Standardvyn för en instans av klassen ExampleProject7 innehåller varaktigheten. Eftersom egenskaperna StartDate och EndDate inte har angetts är $nullegenskapen Varaktighet .

$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

När egenskaperna har angetts korrekt returnerar egenskapen Duration ett tidsintervall som representerar hur länge projektet kördes.

Standardegenskapsvärden

Varje klassegenskap har ett implicit standardvärde beroende på typen av egenskap.

Om en egenskap är en referenstyp, till exempel en sträng eller ett objekt, är $nulldet implicita standardvärdet . Om en egenskap är en värdetyp, till exempel ett tal, booleskt värde eller en uppräkning, har egenskapen ett standardvärde beroende på typ:

  • Numeriska typer, till exempel heltal och flyttalsnummer, är som standard 0
  • Booleska värden är som standard $false
  • Uppräkningar är som standard 0, inte ens uppräkningen definierar en etikett för 0.

Mer information om standardvärden i .NET finns i Standardvärden för C#-typer (C#-referens).

Om du vill definiera ett explicit standardvärde för en egenskap deklarerar du egenskapen med en tilldelning till standardvärdet.

Den här definitionen för klassen ProjectTask definierar till exempel ett explicit standardvärde för guid-egenskapen och tilldelar ett slumpmässigt GUID till varje ny instans.

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

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

Dolda och statiska egenskaper kan också ha standardvärden.

Dolda egenskaper

Du kan dölja egenskaper för en klass genom att deklarera dem med nyckelordet hidden . Dolda klassegenskaper är:

  • Ingår inte i standardutdata för klassen.
  • Ingår inte i listan över klassmedlemmar som returneras av cmdleten Get-Member . Om du vill visa dolda egenskaper med Get-Memberanvänder du parametern Force .
  • Visas inte i tabbslut eller IntelliSense om inte slutförandet sker i klassen som definierar den dolda egenskapen.
  • Offentliga medlemmar i klassen. De kan nås och ändras. Att dölja en egenskap gör den inte privat. Den döljer bara egenskapen enligt beskrivningen i föregående punkter.

Mer information om nyckelordet finns i hidden about_Hidden.

Statiska egenskaper

Du kan definiera en egenskap som tillhör själva klassen i stället för instanser av klassen genom att deklarera egenskapen med nyckelordet static . Egenskaper för statisk klass:

  • Är alltid tillgängliga, oberoende av klass-instansiering.
  • Delas mellan alla instanser av klassen.
  • Är alltid tillgängliga.
  • Kan ändras. Statiska egenskaper kan uppdateras. De är inte oföränderliga som standard.
  • Live under hela sessionsintervallet.

Viktigt!

Statiska egenskaper för klasser som definierats i PowerShell är inte oföränderliga. De kan

Egenskaper för härledd klass

När en klass härleds från en basklass ärver den egenskaperna för basklassen. Alla egenskaper som definierats i basklassen, inklusive dolda egenskaper, är tillgängliga för den härledda klassen.

En härledd klass kan åsidosätta en ärvd egenskap genom att omdefiniera den i klassdefinitionen. Egenskapen för den härledda klassen använder den omdefinierade typen och standardvärdet, om det finns. Om den ärvda egenskapen definierade ett standardvärde och den omdefinierade egenskapen inte gör det, har den ärvda egenskapen inget standardvärde.

Om en härledd klass inte åsidosätter en statisk egenskap får åtkomst till den statiska egenskapen via den härledda klassen åtkomst till basklassens statiska egenskap. Om du ändrar egenskapsvärdet via den härledda klassen ändras värdet för basklassen. Alla andra härledda klasser som inte åsidosätter den statiska egenskapen använder också värdet för egenskapen i basklassen. Att uppdatera värdet för en ärvd statisk egenskap i en klass som inte åsidosätter egenskapen kan ha oavsiktliga effekter för klasser som härleds från samma basklass.

I följande exempel visas beteendet för statiska egenskaper och instansegenskaper i härledda klasser.

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 för DerivedClassC är en tom sträng eftersom klassen omdefinierade egenskapen utan att ange ett standardvärde. För DerivedClassD beror Override värdet på att klassen omdefinierade egenskapen med strängen som standardvärde.

"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

Förutom DerivedClassD är värdet för den statiska egenskapen för de härledda klasserna detsamma som basklassen, eftersom de inte omdefinierar egenskapen. Detta gäller även för DerivedClassC, som ärver från DerivedClassB i stället för direkt från 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

När StaticProperty används och ändras via DerivedClassA påverkar det ändrade värdet varje klass förutom DerivedClassD.

Mer information om klassarv, inklusive ett omfattande exempel, finns i about_Classes_Inheritance.

Använda egenskapsattribut

PowerShell innehåller flera attributklasser som du kan använda för att förbättra information om datatyper och verifiera data som tilldelats en egenskap. Med valideringsattribut kan du testa att värden som ges till egenskaper uppfyller definierade krav. Valideringen utlöses när värdet tilldelas.

Mer information om tillgängliga attribut finns i about_Functions_Advanced_Parameters.

Definiera instansegenskaper med Update-TypeData

Förutom att deklarera egenskaper direkt i klassdefinitionen kan du definiera egenskaper för instanser av en klass i den statiska konstruktorn med hjälp av cmdleten Update-TypeData .

Använd det här kodfragmentet som utgångspunkt för mönstret. Ersätt platshållartexten i vinkelparenteser efter behov.

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

Dricks

Cmdleten Add-Member kan lägga till egenskaper och metoder i en klass i icke-statiska konstruktorer, men cmdleten körs varje gång konstruktorn anropas. Om du använder Update-TypeData den statiska konstruktorn ser du till att koden för att lägga till medlemmar i klassen bara behöver köras en gång i en session.

Lägg bara till egenskaper i klassen i icke-statiska konstruktorer när de inte kan definieras med Update-TypeData, som skrivskyddade egenskaper.

Definiera aliasegenskaper

Aliasattributet har ingen effekt när det används i en klassegenskapsdeklaration. PowerShell använder bara det attributet för att definiera alias för cmdlet-, parameter- och funktionsnamn.

Om du vill definiera ett alias för en klassegenskap använder du Update-TypeData med AliasProperty MemberType.

Den här definitionen av klassen OperablePair definierar till exempel två heltalsegenskaper x och y med aliasen LeftHandSide respektive RightHandSide.

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

Med de definierade aliasen kan användarna komma åt egenskaperna med något av namnen.

$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

Definiera beräknade egenskaper

Om du vill definiera en egenskap som refererar till värdena för andra egenskaper använder du cmdleten Update-TypeData ScriptProperty med MemberType.

Den här definitionen av klassen Budget definierar till exempel egenskaperna Utgifter och intäkter som matriser med flyttalsnummer. Den använder cmdleten Update-TypeData för att definiera beräknade egenskaper för totala utgifter, totala intäkter och nettointäkter.

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}

Definiera egenskaper med anpassad get- och set-logik

PowerShell-klassegenskaper kan inte definiera anpassad getter- och setterlogik direkt. Du kan approximera den här funktionen genom att definiera en bakgrundsegenskap med nyckelordet hidden och använda Update-TypeData för att definiera en synlig egenskap med anpassad logik för att hämta och ange värdet.

Definiera det dolda egenskapsnamnet för säkerhetskopiering med ett understrecksprefix och använd kamelhölje enligt konvention. I stället för TaskCountger du till exempel namnet den dolda bakgrundsegenskapen _taskCount.

I det här exemplet definierar klassen ProjectSize en dold heltalsegenskap med namnet _value. Den definierar Värde som en ScriptProperty med anpassad logik för att hämta och ange egenskapen _value. Setter scriptblock hanterar konvertering av strängrepresentationen av projektet till rätt storlek.

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

Med den anpassade gettern och settern definierad kan du ange egenskapen Value som antingen ett heltal eller en sträng.

$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

Begränsningar

PowerShell-klassegenskaper har följande begränsningar:

  • Statiska egenskaper är alltid föränderliga. PowerShell-klasser kan inte definiera oföränderliga statiska egenskaper.

    Lösning: Inga.

  • Egenskaper kan inte använda attributet ValidateScript eftersom attributargument för klassegenskap måste vara konstanter.

    Lösning: Definiera en klass som ärver från typen ValidateArgumentsAttribute och använd det attributet i stället.

  • Direkt deklarerade egenskaper kan inte definiera anpassade implementeringar av getter och setter.

    Lösning: Definiera en dold egenskap och använd Update-TypeData för att definiera den synliga getter- och setterlogik.

  • Egenskaper kan inte använda aliasattributet. Attributet gäller endast för parametrar, cmdletar och funktioner.

    Lösning: Använd cmdleten Update-TypeData för att definiera alias i klasskonstruktorerna.

  • När en PowerShell-klass konverteras till JSON med cmdleten ConvertTo-Json innehåller utdata-JSON alla dolda egenskaper och deras värden.

    Lösning: Inga

Se även