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
. 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
숨겨진 속성과 정적 속성에는 기본값도 있을 수 있습니다.
숨겨진 속성
키워드를 사용하여 선언하여 클래스의 속성을 숨길 수 있습니다 hidden
.
숨겨진 클래스 속성은 다음과 같습니다.
- 클래스의 기본 출력에 포함되지 않습니다.
- cmdlet에서 반환
Get-Member
하는 클래스 멤버 목록에 포함되지 않습니다. 숨겨진 속성을Get-Member
표시하려면 Force 매개 변수를 사용합니다. - 숨겨진 속성을 정의하는 클래스에서 완료가 발생하지 않는 한 탭 완성 또는 IntelliSense에 표시되지 않습니다.
- 클래스의 공용 멤버입니다. 액세스하고 수정할 수 있습니다. 속성을 숨기면 비공개로 만들 수 없습니다. 이전 지점에 설명된 대로 속성만 숨깁니다.
키워드에 hidden
대한 자세한 내용은 about_Hidden 참조하세요.
정적 속성
키워드를 사용하여 속성을 선언하여 클래스 인스턴스 대신 클래스 자체에 속하는 속성을 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, 매개 변수 및 함수 이름에 대한 별칭을 정의합니다.
클래스 속성에 대한 별칭을 정의하려면 MemberType과 AliasProperty
함께 사용합니다Update-TypeData
.
예를 들어 OperablePair 클래스의 이 정의는 별칭 LeftHandSide와 RightHandSide를 각각 사용하여 두 개의 정수 속성 x와 y를 정의합니다.
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
계산된 속성 정의
다른 속성의 값을 참조하는 속성을 정의하려면 MemberType과 Update-TypeData
함께 cmdlet을 ScriptProperty
사용합니다.
예를 들어 예산 클래스의 이 정의는 Expenses 및 Revenues 속성을 부동 소수점 숫자의 배열로 정의합니다. 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 논리를 직접 정의할 수 없습니다. 키워드를 사용하여 백업 속성을 hidden
정의하고 값을 가져오고 설정하기 위한 사용자 지정 논리를 사용하여 Update-TypeData
표시되는 속성을 정의하여 이 기능을 근사화할 수 있습니다.
규칙에 따라 밑줄 접두사를 사용하여 숨겨진 백업 속성 이름을 정의하고 낙타 대/소문자를 사용합니다. 예를 들어, 대신 TaskCount
숨겨진 백업 속성의 이름을 지정합니다 _taskCount
.
이 예제에서 ProjectSize 클래스는 _value 명명된 숨겨진 정수 속성을 정의합니다. _value 속성을 가져오고 설정하기 위한 사용자 지정 논리를 사용하여 Value ScriptProperty
를 정의합니다. 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에는 숨겨진 속성과 해당 값이 모두 포함됩니다.해결 방법: 없음
참고 항목
PowerShell