간단한 설명
PowerShell 클래스에 대한 속성을 정의하는 방법을 설명합니다.
긴 설명
속성은 데이터를 포함하는 클래스의 멤버입니다. 속성은 클래스 범위에서 변수로 선언됩니다. 속성은 기본 제공 형식이거나 다른 클래스의 인스턴스일 수 있습니다. 클래스는 0개 이상의 속성을 사용할 수 있습니다. 클래스에는 최대 속성 수가 없습니다.
클래스 속성에는 숨겨진 및 정적 특성을 포함하여 다양한 특성이 있을 수 있습니다. 모든 속성 정의는 속성에 대한 형식을 포함해야 합니다. 속성의 기본값을 정의할 수 있습니다.
Syntax
클래스 속성은 다음 구문을 사용합니다.
한 줄 구문
[[<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. 다른 속성은 값 형식 속성이므로 정의된 형식의 기본값을 갖습니다. 속성의 기본값에 대한 자세한 내용은 Default 속성 값을 참조하세요.
예제 2 - 사용자 지정 형식을 사용하는 클래스 속성
ExampleProject2 속성에는 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
예제 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 스크립트 속성을 정의합니다. powerShell 클래스에 대한 고급 속성을 정의하는 유일한 방법은 Update-TypeData 또는 Add-Member cmdlet을 사용하는 것입니다.
Duration 속성은 $null 및 EndDate 속성이 모두 설정되고 StartDateEndDate이전으로 정의되지 않는 한 값을 반환합니다.
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 키워드를 사용하여 선언하여 클래스의 속성을 숨길 수 있습니다.
숨겨진 클래스 속성은 다음과 같습니다.
- 클래스의 기본 출력에 포함되지 않습니다.
-
Get-Membercmdlet에서 반환된 클래스 멤버 목록에 포함되지 않습니다.Get-Member숨겨진 속성을 표시하려면 Force 매개 변수를 사용합니다. - 숨겨진 속성을 정의하는 클래스에서 완료가 발생하지 않는 한 탭 완성 또는 IntelliSense에 표시되지 않습니다.
- 클래스의 공용 멤버입니다. 액세스하고 수정할 수 있습니다. 속성을 숨기면 비공개로 만들 수 없습니다. 이전 지점에 설명된 대로 속성만 숨깁니다.
hidden 키워드에 대한 자세한 내용은 about_Hidden참조하세요.
정적 속성
static 키워드를 사용하여 속성을 선언하여 클래스 인스턴스 대신 클래스 자체에 속하는 속성을 정의할 수 있습니다. 정적 클래스 속성:
- 클래스 인스턴스화와 관계없이 항상 사용할 수 있습니다.
- 클래스의 모든 인스턴스에서 공유됩니다.
- 항상 사용할 수 있습니다.
- 수정할 수 있습니다. 정적 속성을 업데이트할 수 있습니다. 기본적으로 변경할 수 없습니다.
- 전체 세션 범위에 대해 라이브입니다.
중요하다
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
DerivedClassA통해 StaticProperty 액세스하고 수정하면 변경된 값은 DerivedClassD제외한 모든 클래스에 영향을 줍니다.
포괄적인 예제를 포함하여 클래스 상속에 대한 자세한 내용은 about_Classes_Inheritance참조하세요.
속성 특성 사용
PowerShell에는 데이터 형식 정보를 향상시키고 속성에 할당된 데이터의 유효성을 검사하는 데 사용할 수 있는 몇 가지 특성 클래스가 포함되어 있습니다. 유효성 검사 특성을 사용하면 속성에 지정된 값이 정의된 요구 사항을 충족하는지 테스트할 수 있습니다. 값이 할당되는 순간 유효성 검사가 트리거됩니다.
사용 가능한 특성에 대한 자세한 내용은 about_Functions_Advanced_Parameters참조하세요.
Update-TypeData 사용하여 인스턴스 속성 정의
클래스 정의에서 직접 속성을 선언하는 것 외에도 Update-TypeData cmdlet을 사용하여 정적 생성자의 클래스 인스턴스에 대한 속성을 정의할 수 있습니다.
이 코드 조각을 패턴의 시작점으로 사용합니다. 필요에 따라 자리 표시자 텍스트를 꺾쇠 괄호로 바꿉니다.
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
}
}
}
팁
Add-Member cmdlet은 비정적 생성자의 클래스에 속성과 메서드를 추가할 수 있지만 생성자가 호출될 때마다 cmdlet이 실행됩니다. 정적 생성자에서 Update-TypeData 사용하면 클래스에 멤버를 추가하는 코드가 세션에서 한 번만 실행하면 됩니다.
읽기 전용 속성과 같이 Update-TypeData사용하여 정의할 수 없는 경우에만 비정적 생성자의 클래스에 속성을 추가합니다.
별칭 속성 정의
별칭 특성은 클래스 속성 선언에 사용할 때 영향을 주지 않습니다. PowerShell은 해당 특성만 사용하여 cmdlet, 매개 변수 및 함수 이름에 대한 별칭을 정의합니다.
클래스 속성에 대한 별칭을 정의하려면 Update-TypeDataAliasProperty 사용합니다.
예를 들어 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
계산된 속성 정의
다른 속성의 값을 참조하는 속성을 정의하려면 Update-TypeDataScriptProperty cmdlet을 사용합니다.
예를 들어 이 Budget 클래스 정의는 Expenses 및 Revenues 속성을 부동 소수점 숫자의 배열로 정의합니다.
Update-TypeData cmdlet을 사용하여 총 비용, 총 수익 및 순이익에 대한 계산 속성을 정의합니다.
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숨겨진 정수 속성을 정의합니다.
값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 구현을 정의할 수 없습니다.
해결 방법: 숨겨진 속성을 정의하고
Update-TypeData사용하여 표시되는 getter 및 setter 논리를 정의합니다.속성은 별칭 특성을 사용할 수 없습니다. 이 특성은 매개 변수, cmdlet 및 함수에만 적용됩니다.
해결 방법:
Update-TypeDatacmdlet을 사용하여 클래스 생성자에서 별칭을 정의합니다.powerShell 클래스가
ConvertTo-Jsoncmdlet을 사용하여 JSON으로 변환되는 경우 출력 JSON에는 숨겨진 모든 속성과 해당 값이 포함됩니다.해결 방법: 없음
참고하십시오
PowerShell