about_Classes_Properties
Krótki opis
Opisuje sposób definiowania właściwości dla klas programu PowerShell.
Długi opis
Właściwości to składowe klasy zawierającej dane. Właściwości są deklarowane jako zmienne w zakresie klasy. Właściwość może mieć dowolny typ wbudowany lub wystąpienie innej klasy. Klasy mogą zawierać zero lub więcej właściwości. Klasy nie mają maksymalnej liczby właściwości.
Właściwości klasy mogą mieć dowolną liczbę atrybutów, w tym atrybuty ukryte i statyczne . Każda definicja właściwości musi zawierać typ właściwości. Można zdefiniować wartość domyślną dla właściwości.
Składnia
Właściwości klasy używają następujących składni:
Składnia jednowierszowa
[[<attribute>]...] [<property-type>] $<property-name> [= <default-value>]
Składnia wielowierszowa
[[<attribute>]...]
[<property-type>]
$<property-name> [= <default-value>]
Przykłady
Przykład 1 — minimalne właściwości klasy
Właściwości klasy ExampleProject1 używają typów wbudowanych bez żadnych atrybutów ani wartości domyślnych.
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
Wartością domyślną właściwości Name i Assignee jest $null
to, że są one wpisywane jako ciągi, czyli typ odwołania. Inne właściwości mają wartość domyślną dla zdefiniowanego typu, ponieważ są właściwościami typu wartości. Aby uzyskać więcej informacji na temat wartości domyślnych właściwości, zobacz Domyślne wartości właściwości.
Przykład 2 — właściwości klasy z typami niestandardowymi
Właściwości elementu ExampleProject2 obejmują niestandardową wyliczenie i klasę zdefiniowaną w programie PowerShell przed klasą 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
Przykład 3 — właściwość klasy z atrybutem weryfikacji
Klasa ExampleProject3 definiuje właściwość Size jako liczbę całkowitą, która musi być większa lub równa 0 i mniejsza lub równa 16. Używa atrybutu ValidateRange , aby ograniczyć wartość.
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
Gdy wystąpi wystąpienie ExampleProject3, wartość domyślna rozmiaru to 0. Ustawienie właściwości na wartość w prawidłowym zakresie powoduje zaktualizowanie wartości.
$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
Gdy właściwość Size jest ustawiona na nieprawidłową wartość poza zakresem, program PowerShell zgłasza wyjątek i wartość nie zostanie zmieniona.
$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
Przykład 4 — właściwość Klasy z jawną wartością domyślną
Klasa ExampleProject4 domyślnie ustawia wartość właściwości StartDate na bieżącą datę.
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
Przykład 5 — właściwość klasy ukrytej
Właściwość Guid klasy ExampleProject5 ma hidden
słowo kluczowe . Właściwość Guid nie jest wyświetlana w domyślnych danych wyjściowych klasy ani na liście właściwości zwracanych przez Get-Member
element .
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;}
Przykład 6 — właściwość klasy statycznej
Klasa ExampleProject6 definiuje właściwość static Projects jako listę wszystkich utworzonych projektów. Domyślny konstruktor klasy dodaje nowe wystąpienie do listy projektów.
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
Przykład 7 — definiowanie właściwości w konstruktorze
Klasa ExampleProject7 definiuje właściwość skryptu Duration w konstruktorze klasy statycznej za pomocą Update-TypeData
polecenia cmdlet . Użycie polecenia Update-TypeData
cmdlet lub Add-Member
to jedyny sposób definiowania zaawansowanych właściwości dla klas programu PowerShell.
Właściwość Duration zwraca wartość , $null
chyba że ustawiono zarówno właściwości StartDate, jak i EndDate, a właściwość StartDate jest zdefiniowana jako wcześniejsza niż Data zakończenia.
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
Widok domyślny dla wystąpienia klasy ExampleProject7 obejmuje czas trwania. Ponieważ właściwości StartDate i EndDate nie są ustawione, właściwość Duration ma wartość $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
Po poprawnym ustawieniu właściwości Duration właściwość Duration zwraca przedział czasu reprezentujący czas uruchomienia projektu.
Domyślne wartości właściwości
Każda właściwość klasy ma niejawną wartość domyślną w zależności od typu właściwości.
Jeśli właściwość jest typem odwołania, na przykład ciągiem lub obiektem, niejawna wartość domyślna to $null
. Jeśli właściwość jest typem wartości, na przykład liczba, wartość logiczna lub wyliczenie, właściwość ma wartość domyślną w zależności od typu:
- Typy liczbowe, takie jak liczby całkowite i liczby zmiennoprzecinkowe, domyślnie to
0
- Wartości logiczne są domyślnie ustawione na
$false
- Wartości domyślne wyliczenia to
0
, nawet wyliczenie nie definiuje etykiety dla elementu0
.
Aby uzyskać więcej informacji na temat wartości domyślnych na platformie .NET, zobacz Domyślne wartości typów języka C# (odwołanie w C#).
Aby zdefiniować jawną wartość domyślną dla właściwości, zadeklaruj właściwość przy użyciu przypisania do wartości domyślnej.
Na przykład ta definicja klasy ProjectTask definiuje jawną wartość domyślną dla właściwości Guid, przypisując losowy identyfikator GUID do każdego nowego wystąpienia.
class ProjectTask {
[string] $Name
[string] $Description
[string] $Guid = (New-Guid).Guid
}
[ProjectTask]::new()
Name Description Guid
---- ----------- ----
aa96350c-358d-465c-96d1-a49949219eec
Ukryte i statyczne właściwości mogą również mieć wartości domyślne.
Ukryte właściwości
Właściwości klasy można ukryć, deklarując je za pomocą słowa kluczowego hidden
.
Ukryte właściwości klasy to:
- Nieuwzględniane w domyślnych danych wyjściowych klasy.
- Nieuwzględniane na liście składowych klas zwracanych przez
Get-Member
polecenie cmdlet. Aby wyświetlić ukryte właściwości za pomocąGet-Member
polecenia , użyj parametru Force . - Nie są wyświetlane w uzupełnianiu tabulatora lub funkcji IntelliSense, chyba że ukończenie występuje w klasie definiującej właściwość ukrytą.
- Publiczne elementy członkowskie klasy. Dostęp do nich można uzyskać i zmodyfikować. Ukrywanie właściwości nie powoduje, że jest ona prywatna. Ukrywa tylko właściwość zgodnie z opisem w poprzednich punktach.
Aby uzyskać więcej informacji na temat słowa kluczowego hidden
, zobacz about_Hidden.
Właściwości statyczne
Właściwość można zdefiniować jako należącą do samej klasy zamiast wystąpień klasy, deklarując właściwość za pomocą słowa kluczowego static
. Właściwości klasy statycznej:
- Są zawsze dostępne, niezależne od wystąpienia klas.
- Są współużytkowane we wszystkich wystąpieniach klasy.
- Są zawsze dostępne.
- Można modyfikować. Właściwości statyczne można zaktualizować. Nie są one domyślnie niezmienne.
- Na żywo dla całego zakresu sesji.
Ważne
Właściwości statyczne dla klas zdefiniowanych w programie PowerShell nie są niezmienne. Mogą
Właściwości klasy pochodnej
Gdy klasa pochodzi z klasy bazowej, dziedziczy właściwości klasy bazowej. Wszystkie właściwości zdefiniowane w klasie bazowej, w tym ukryte właściwości, są dostępne w klasie pochodnej.
Klasa pochodna może zastąpić dziedziczona właściwość, ponownie definiując ją w definicji klasy. Właściwość klasy pochodnej używa ponownie zdefiniowanego typu i wartości domyślnej, jeśli istnieje. Jeśli dziedziczona właściwość zdefiniowała wartość domyślną, a właściwość ponownie zdefiniowana nie, dziedziczona właściwość nie ma wartości domyślnej.
Jeśli klasa pochodna nie zastępuje właściwości statycznej, uzyskiwanie dostępu do właściwości statycznej za pośrednictwem klasy pochodnej uzyskuje dostęp do właściwości statycznej klasy bazowej. Modyfikowanie wartości właściwości za pomocą klasy pochodnej modyfikuje wartość w klasie bazowej. Każda inna klasa pochodna, która nie zastępuje właściwości statycznej, używa również wartości właściwości w klasie bazowej. Aktualizowanie wartości odziedziczonej właściwości statycznej w klasie, która nie zastępuje właściwości, może mieć niezamierzone efekty dla klas pochodnych z tej samej klasy bazowej.
W poniższym przykładzie pokazano zachowanie właściwości statycznych i wystąpień dla klas pochodnych.
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
Właściwość InstanceProperty dla klasy DerivedClassC jest pustym ciągiem, ponieważ klasa ponownie zdefiniowała właściwość bez ustawiania wartości domyślnej. W przypadku klasy DerivedClassD wartość jest Override
taka, ponieważ klasa ponownie zdefiniowała właściwość z tym ciągiem jako wartość domyślną.
"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
Z wyjątkiem klasy DerivedClassD wartość właściwości statycznej dla klas pochodnych jest taka sama jak klasa bazowa, ponieważ nie definiują ponownie właściwości. Dotyczy to nawet klasy DerivedClassC, która dziedziczy z klasy DerivedClassB zamiast bezpośrednio z klasy 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
Gdy dostęp do właściwości StaticProperty jest uzyskiwany i modyfikowany za pośrednictwem klasy DerivedClassA, zmieniona wartość wpływa na każdą klasę z wyjątkiem klasy DerivedClassD.
Aby uzyskać więcej informacji na temat dziedziczenia klas, w tym kompleksowy przykład, zobacz about_Classes_Inheritance.
Używanie atrybutów właściwości
Program PowerShell zawiera kilka klas atrybutów, których można użyć do ulepszania informacji o typie danych i sprawdzania poprawności danych przypisanych do właściwości. Atrybuty weryfikacji umożliwiają przetestowanie, czy wartości podane właściwości spełniają zdefiniowane wymagania. Walidacja jest wyzwalana w momencie przypisania wartości.
Aby uzyskać więcej informacji na temat dostępnych atrybutów, zobacz about_Functions_Advanced_Parameters.
Definiowanie właściwości wystąpienia za pomocą właściwości Update-TypeData
Poza deklarowaniem właściwości bezpośrednio w definicji klasy można zdefiniować właściwości dla wystąpień klasy w konstruktorze statycznym przy użyciu Update-TypeData
polecenia cmdlet .
Użyj tego fragmentu kodu jako punktu wyjścia dla wzorca. Zastąp tekst zastępczy w nawiasach kątowych zgodnie z potrzebami.
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
}
}
}
Napiwek
Polecenie Add-Member
cmdlet może dodawać właściwości i metody do klasy w konstruktorach niestacjonanych, ale polecenie cmdlet jest uruchamiane za każdym razem, gdy konstruktor jest wywoływany. Użycie Update-TypeData
w konstruktorze statycznym gwarantuje, że kod dodawania składowych do klasy musi być uruchamiany tylko raz w sesji.
Dodaj właściwości tylko do klasy w konstruktorach niestacjonanych, gdy nie można ich zdefiniować za pomocą Update-TypeData
właściwości , takich jak właściwości tylko do odczytu.
Definiowanie właściwości aliasu
Atrybut Alias nie ma wpływu na deklarację właściwości klasy. Program PowerShell używa tylko tego atrybutu do definiowania aliasów dla poleceń cmdlet, parametrów i nazw funkcji.
Aby zdefiniować alias dla właściwości klasy, użyj właściwości Update-TypeData
AliasProperty
MemberType.
Na przykład ta definicja klasy OperablePair definiuje dwie właściwości całkowite x i y z aliasami LeftHandSide i RightHandSide odpowiednio.
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 }
}
Po zdefiniowaniu aliasów użytkownicy mogą uzyskiwać dostęp do właściwości z jedną z nazw.
$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
Definiowanie właściwości obliczeniowych
Aby zdefiniować właściwość odwołującą się do wartości innych właściwości, użyj Update-TypeData
polecenia cmdlet z właściwością ScriptProperty
MemberType.
Na przykład ta definicja klasy Budget definiuje właściwości Wydatki i Przychody jako tablice liczb zmiennoprzecinkowych. Używa Update-TypeData
polecenia cmdlet do definiowania właściwości obliczeniowych dla całkowitych wydatków, całkowitych przychodów i dochodu netto.
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}
Definiowanie właściwości za pomocą niestandardowej logiki pobierania i ustawiania
Właściwości klasy programu PowerShell nie mogą bezpośrednio definiować niestandardowego modułu pobierania i logiki ustawiającej. Można przybliżyć tę funkcję, definiując właściwość tworzenia kopii zapasowej za pomocą słowa kluczowego hidden
i definiując Update-TypeData
widoczną właściwość z niestandardową logiką pobierania i ustawiania wartości.
Zgodnie z konwencją zdefiniuj ukrytą nazwę właściwości kopii zapasowej z prefiksem podkreślenia i użyj wielkości liter wielbłąda. Na przykład zamiast nazwy , nadaj TaskCount
ukrytej właściwości _taskCount
kopii zapasowej .
W tym przykładzie klasa ProjectSize definiuje ukrytą właściwość całkowitą o nazwie _value. Definiuje wartość jako element z niestandardową logiką ScriptProperty
pobierania i ustawiania właściwości _value . Blok skryptu ustawiającego obsługuje konwertowanie reprezentacji ciągu projektu na poprawny rozmiar.
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
}
}
Po zdefiniowaniu niestandardowego modułu pobierającego i ustawiającego można ustawić właściwość Value jako liczbę całkowitą lub ciąg.
$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
Ograniczenia
Właściwości klasy programu PowerShell mają następujące ograniczenia:
Właściwości statyczne są zawsze modyfikowalne. Klasy programu PowerShell nie mogą definiować niezmiennych właściwości statycznych.
Obejście: brak.
Właściwości nie mogą używać atrybutu ValidateScript , ponieważ argumenty atrybutu właściwości klasy muszą być stałe.
Obejście: Zdefiniuj klasę dziedziczą z typu ValidateArgumentsAttribute i użyj tego atrybutu.
Właściwości zadeklarowane bezpośrednio nie mogą definiować niestandardowych implementacji getter i setter.
Obejście: Zdefiniuj właściwość ukrytą i użyj polecenia
Update-TypeData
, aby zdefiniować widoczną logikę pobierania i ustawiania.Właściwości nie mogą używać atrybutu Alias . Atrybut dotyczy tylko parametrów, poleceń cmdlet i funkcji.
Obejście: Użyj
Update-TypeData
polecenia cmdlet, aby zdefiniować aliasy w konstruktorach klas.Po przekonwertowaniu klasy programu PowerShell na kod JSON za
ConvertTo-Json
pomocą polecenia cmdlet dane wyjściowe JSON zawierają wszystkie ukryte właściwości i ich wartości.Obejście: brak