about_Classes_Properties

간단한 설명

PowerShell 클래스에 대한 속성을 정의하는 방법을 설명합니다.

자세한 설명

속성은 데이터를 포함하는 클래스의 멤버입니다. 속성은 클래스 범위에서 변수로 선언됩니다. 속성은 기본 제공 형식이거나 다른 클래스의 인스턴스일 수 있습니다. 클래스는 0개 이상의 속성을 사용할 수 있습니다. 클래스에는 최대 속성 수가 없습니다.

클래스 속성에는 숨겨진 특성과 정적 특성을 포함하여 여러 특성이 있을 수 있습니다. 모든 속성 정의는 속성에 대한 형식을 포함해야 합니다. 속성의 기본값을 정의할 수 있습니다.

구문

클래스 속성은 다음 구문을 사용합니다.

한 줄 구문

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

여러 줄 구문

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

예제

예제 1 - 최소 클래스 속성

ExampleProject1 클래스의 속성은 특성이나 기본값 없이 기본 제공 형식을 사용합니다.

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

[ExampleProject1]::new()

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

True

Name 및 Assignee 속성의 기본값은 $null 참조 형식인 문자열로 입력되기 때문입니다. 다른 속성은 값 형식 속성이므로 정의된 형식의 기본값을 갖습니다. 속성의 기본값에 대한 자세한 내용은 기본 속성 값을 참조 하세요.

예제 2 - 사용자 지정 형식을 사용하는 클래스 속성

ExampleProject2의 속성에는 ExampleProject2 클래스 이전에 PowerShell에 정의된 사용자 지정 열거형 및 클래스가 포함됩니다.

enum ProjectState {
    NotTriaged
    ReadyForWork
    Committed
    Blocked
    InProgress
    Done
}

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

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

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

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

예제 3 - 유효성 검사 특성이 있는 클래스 속성

ExampleProject3 클래스는 Size 속성을 0보다 크거나 같고 16보다 작거나 같아야 하는 정수로 정의합니다. ValidateRange 특성을 사용하여 값을 제한합니다.

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

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

ExampleProject3이 인스턴스화되면 크기기본적으로 0으로 설정됩니다. 속성을 유효한 범위 내의 값으로 설정하면 값이 업데이트됩니다.

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

크기가 범위를 벗어난 잘못된 값으로 설정되면 PowerShell에서 예외가 발생하며 값이 변경되지 않습니다.

$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

예제 4 - 명시적 기본값이 있는 클래스 속성

ExampleProject4 클래스는 StartDate 속성의 값을 현재 날짜로 기본값으로 지정합니다.

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

[ExampleProject4]::new()

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

True

예제 5 - Hidden 클래스 속성

ExampleProject5 클래스의 Guid 속성에는 hidden 키워드(keyword) 있습니다. Guid 속성은 클래스의 기본 출력 또는 반환된 Get-Member속성 목록에 표시되지 않습니다.

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

$project = [ExampleProject5]::new()

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

$project

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

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


   TypeName: ExampleProject5

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

예제 6 - 정적 클래스 속성

ExampleProject6 클래스는 정적 Projects 속성을 만든 모든 프로젝트의 목록으로 정의합니다. 클래스의 기본 생성자는 프로젝트 목록에 새 인스턴스를 추가합니다.

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

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

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

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

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

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

예제 7 - 생성자에서 속성 정의

ExampleProject7 클래스는 cmdlet을 사용하여 정적 클래스 생성자의 Update-TypeData Duration 스크립트 속성을 정의합니다. PowerShell 클래스에 Update-TypeData 대한 고급 속성을 정의하는 유일한 방법은 or Add-Member cmdlet을 사용하는 것입니다.

Duration 속성은 StartDate 및 EndDate 속성이 모두 설정되고 StartDate가 EndDate보다 이전으로 정의되지 않는 한 값을 $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

숨겨진 속성과 정적 속성에는 기본값도 있을 수 있습니다.

숨겨진 속성

키워드(keyword) 사용하여 선언하여 hidden 클래스의 속성을 숨길 수 있습니다. 숨겨진 클래스 속성은 다음과 같습니다.

  • 클래스의 기본 출력에 포함되지 않습니다.
  • cmdlet에서 반환 Get-Member 하는 클래스 멤버 목록에 포함되지 않습니다. 숨겨진 속성을 Get-Member표시하려면 Force 매개 변수를 사용합니다.
  • 숨겨진 속성을 정의하는 클래스에서 완료가 발생하지 않는 한 탭 완성 또는 IntelliSense에 표시되지 않습니다.
  • 클래스의 공용 멤버입니다. 액세스하고 수정할 수 있습니다. 속성을 숨기면 비공개로 만들 수 없습니다. 이전 지점에 설명된 대로 속성만 숨깁니다.

키워드(keyword) 대한 hidden 자세한 내용은 about_Hidden 참조하세요.

정적 속성

키워드(keyword) 사용하여 속성을 선언하여 클래스의 인스턴스 대신 클래스 자체에 속하는 속성을 static 정의할 수 있습니다. 정적 클래스 속성:

  • 클래스 인스턴스화와 관계없이 항상 사용할 수 있습니다.
  • 클래스의 모든 인스턴스에서 공유됩니다.
  • 항상 사용할 수 있습니다.
  • 수정할 수 있습니다. 정적 속성을 업데이트할 수 있습니다. 기본적으로 변경할 수 없습니다.
  • 전체 세션 범위에 대해 라이브입니다.

Important

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

클래스가 기본값을 설정하지 않고 속성을 다시 정의했기 때문에 DerivedClassC의 InstanceProperty는 빈 문자열입니다. 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를 사용하여 인스턴스 속성 정의

클래스 정의에서 직접 속성을 선언하는 것 외에도 cmdlet을 사용하여 정적 생성자의 클래스 인스턴스에 대한 속성을 정의할 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
        }
    }
}

cmdlet은 Add-Member 비정적 생성자의 클래스에 속성과 메서드를 추가할 수 있지만 생성자가 호출될 때마다 cmdlet이 실행됩니다. 정적 생성자에서 사용하면 Update-TypeData 클래스에 멤버를 추가하는 코드가 세션에서 한 번만 실행하면 됩니다.

읽기 전용 속성과 같이 정의 Update-TypeData할 수 없는 경우에만 비정적 생성자의 클래스에 속성을 추가합니다.

별칭 속성 정의

별칭 특성은 클래스 속성 선언에 사용할 때 영향을 주지 않습니다. PowerShell은 해당 특성만 사용하여 cmdlet, 매개 변수 및 함수 이름에 대한 별칭을 정의합니다.

클래스 속성에 대한 별칭을 정의하려면 MemberTypeAliasProperty함께 사용합니다Update-TypeData.

예를 들어 OperablePair 클래스의 이 정의는 별칭 LeftHandSide와 RightHandSide를 각각 사용하여 두 개의 정수 속성 xy를 정의합니다.

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

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

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

    OperablePair() {}

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

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

별칭이 정의되면 사용자는 두 이름 중 하나를 사용하여 속성에 액세스할 수 있습니다.

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

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

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

3 x 2 = 6

계산된 속성 정의

다른 속성의 값을 참조하는 속성을 정의하려면 MemberTypeUpdate-TypeData 함께 cmdlet을 ScriptProperty사용합니다.

예를 들어 예산 클래스의 이 정의는 ExpensesRevenues 속성을 부동 소수점 숫자의 배열로 정의합니다. cmdlet을 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 클래스 속성은 사용자 지정 getter 및 setter 논리를 직접 정의할 수 없습니다. 키워드(keyword) 사용하여 백업 속성을 hidden 정의하고 값을 가져오고 설정하기 위한 사용자 지정 논리를 사용하여 Update-TypeData 표시되는 속성을 정의하여 이 기능을 근사화할 수 있습니다.

규칙에 따라 밑줄 접두사를 사용하여 숨겨진 백업 속성 이름을 정의하고 낙타 대/소문자를 사용합니다. 예를 들어, 대신 TaskCount숨겨진 백업 속성의 이름을 지정합니다 _taskCount.

이 예제에서 ProjectSize 클래스는 _value 명명된 숨겨진 정수 속성을 정의합니다. _value 속성을 가져오고 설정하기 위한 사용자 지정 논리를 사용하여 ValueScriptProperty 정의합니다. setter scriptblock은 프로젝트의 문자열 표현을 올바른 크기로 변환하는 것을 처리합니다.

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

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

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

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

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

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

        return $Output
    }
}

사용자 지정 getter 및 setter를 정의하면 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 구현을 정의할 수 없습니다.

    해결 방법: 숨겨진 속성을 정의하고 표시되는 getter 및 setter 논리를 정의하는 데 사용합니다 Update-TypeData .

  • 속성은 별칭 특성을 사용할 수 없습니다. 이 특성은 매개 변수, cmdlet 및 함수에만 적용됩니다.

    해결 방법: cmdlet을 Update-TypeData 사용하여 클래스 생성자에서 별칭을 정의합니다.

  • PowerShell 클래스가 cmdlet을 사용하여 JSON으로 ConvertTo-Json 변환되는 경우 출력 JSON에는 숨겨진 속성과 해당 값이 모두 포함됩니다.

    해결 방법: 없음

참고 항목