about_Classes_Properties
Kısa açıklama
PowerShell sınıfları için özelliklerin nasıl tanımlanacağı açıklanır.
Uzun açıklama
Özellikler, veri içeren sınıfın üyeleridir. Özellikler, sınıf kapsamında değişken olarak bildirilir. Bir özellik herhangi bir yerleşik türde veya başka bir sınıfın bir örneğinde olabilir. Sınıflar sıfır veya daha fazla özellik içerebilir. Sınıfların özellik sayısı üst sınırı yoktur.
Sınıf özellikleri, gizli ve statik öznitelikler de dahil olmak üzere herhangi bir sayıda öznitelik içerebilir. Her özellik tanımı özelliği için bir tür içermelidir. Bir özellik için varsayılan değer tanımlayabilirsiniz.
Sözdizimi
Sınıf özellikleri aşağıdaki söz dizimlerini kullanır:
Tek satırlık söz dizimi
[[<attribute>]...] [<property-type>] $<property-name> [= <default-value>]
Çok satırlı söz dizimi
[[<attribute>]...]
[<property-type>]
$<property-name> [= <default-value>]
Örnekler
Örnek 1 - En düşük sınıf özellikleri
ExampleProject1 sınıfının özellikleri, herhangi bir öznitelik veya varsayılan değer olmadan yerleşik türler kullanır.
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
Ad ve Atanan özellikleri $null
için varsayılan değer, bir başvuru türü olan dize olarak yazıldığı içindir. Diğer özellikler, değer türü özellikleri olduğundan tanımlı türleri için varsayılan değere sahiptir. Özelliklerin varsayılan değerleri hakkında daha fazla bilgi için bkz . Varsayılan özellik değerleri.
Örnek 2 - Özel türleri olan sınıf özellikleri
ExampleProject2 özellikleri, ExampleProject2 sınıfından önce PowerShell'de tanımlanan özel bir numaralandırma ve sınıf içerir.
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
Örnek 3 - Doğrulama özniteliğine sahip sınıf özelliği
ExampleProject3 sınıfı, Size özelliğini 0'dan büyük veya 0'a eşit ve 16'ya eşit veya daha küçük olması gereken bir tamsayı olarak tanımlar. Değeri sınırlamak için ValidateRange özniteliğini kullanır.
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 örneği oluşturulduğunda Boyut varsayılan olarak 0'dır. özelliğinin geçerli aralık içindeki bir değere ayarlanması, değeri güncelleştirir.
$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
Boyut, aralığın dışında geçersiz bir değere ayarlandığında PowerShell bir özel durum oluşturur ve değer değiştirilmez.
$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
Örnek 4 - Açık varsayılan değere sahip sınıf özelliği
ExampleProject4 sınıfı, StartDate özelliğinin değerini geçerli tarihe varsayılan olarak alır.
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
Örnek 5 - Gizli sınıf özelliği
ExampleProject5 sınıfının Guid özelliği anahtar sözcüğüne hidden
sahiptir. Guid özelliği sınıfı için varsayılan çıkışta veya tarafından Get-Member
döndürülen özellikler listesinde gösterilmez.
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;}
Örnek 6 - Statik sınıf özelliği
ExampleProject6 sınıfı, statik Projeler özelliğini oluşturulan tüm projelerin listesi olarak tanımlar. sınıfı için varsayılan oluşturucu, yeni örneği projeler listesine ekler.
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
Örnek 7 - Oluşturucuda özellik tanımlama
ExampleProject7 sınıfı, cmdlet'iyle Update-TypeData
statik sınıf oluşturucusunda Duration betiği özelliğini tanımlar. Update-TypeData
Veya Add-Member
cmdlet'ini kullanmak, PowerShell sınıfları için gelişmiş özellikleri tanımlamanın tek yoludur.
Hem StartDate hem de EndDate özellikleri ayarlanmadığı ve StartDate'ın EndDate değerinden önceki bir değer olarak tanımlanmadığı sürece Duration özelliği değerini döndürür.$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 sınıfının bir örneğinin varsayılan görünümü süreyi içerir. StartDate ve EndDate özellikleri ayarlanmamış olduğundan Duration özelliği olur$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
Özellikler doğru ayarlandığında, Duration özelliği projenin ne kadar süre çalıştığını gösteren bir zaman aralığı döndürür.
Varsayılan özellik değerleri
Her sınıf özelliği, özelliğin türüne bağlı olarak örtük bir varsayılan değere sahiptir.
Bir özellik bir dize veya nesne gibi bir başvuru türüyse örtük varsayılan değer olur $null
. Bir özellik sayı, boole veya numaralandırma gibi bir değer türüyse, özelliğin türüne bağlı olarak varsayılan değeri vardır:
- Tamsayılar ve kayan noktalı sayılar gibi sayısal türler varsayılan olarak
0
- Boole değerleri varsayılan olarak
$false
- Sabit listeleri varsayılan olarak
0
, sabit listesi bile için0
bir etiket tanımlamaz.
.NET'teki varsayılan değerler hakkında daha fazla bilgi için bkz . C# türlerinin varsayılan değerleri (C# başvurusu).
Bir özellik için açık bir varsayılan değer tanımlamak için, varsayılan değere atama ile özelliğini bildirin.
Örneğin, ProjectTask sınıfı için bu tanım, her yeni örneğe rastgele bir GUID atayarak Guid özelliği için açık bir varsayılan değer tanımlar.
class ProjectTask {
[string] $Name
[string] $Description
[string] $Guid = (New-Guid).Guid
}
[ProjectTask]::new()
Name Description Guid
---- ----------- ----
aa96350c-358d-465c-96d1-a49949219eec
Gizli ve statik özelliklerin varsayılan değerleri de olabilir.
Gizli özellikler
Bir sınıfın özelliklerini anahtar sözcüğüyle hidden
bildirerek gizleyebilirsiniz.
Gizli sınıf özellikleri şunlardır:
- Sınıfın varsayılan çıkışına dahil değildir.
- cmdlet'i tarafından
Get-Member
döndürülen sınıf üyeleri listesine dahil değildir. ileGet-Member
gizli özellikleri göstermek için Force parametresini kullanın. - Gizli özelliği tanımlayan sınıfta tamamlanma gerçekleşmediği sürece sekme tamamlama veya IntelliSense'te görüntülenmez.
- Sınıfın genel üyeleri. Bunlara erişilebilir ve değiştirilebilir. Bir özelliğin gizlenmesi özelliği özel yapmaz. Özelliği yalnızca önceki noktalarda açıklandığı gibi gizler.
Anahtar sözcük hakkında hidden
daha fazla bilgi için bkz . about_Hidden.
Statik özellikler
bir özelliği anahtar sözcüğüyle static
bildirerek sınıfın örnekleri yerine sınıfın kendisine ait olarak tanımlayabilirsiniz. Statik sınıf özellikleri:
- Sınıf örneklemeden bağımsız olarak her zaman kullanılabilir.
- Sınıfın tüm örnekleri arasında paylaşılır.
- Her zaman kullanılabilir.
- Değiştirilebilir. Statik özellikler güncelleştirilebilir. Bunlar varsayılan olarak sabit değildir.
- Tüm oturum süresi boyunca canlı.
Önemli
PowerShell'de tanımlanan sınıfların statik özellikleri sabit değildir. Bunu yapabilir
Türetilmiş sınıf özellikleri
Bir sınıf bir temel sınıftan türetildiğinde, temel sınıfın özelliklerini devralır. Gizli özellikler de dahil olmak üzere temel sınıfta tanımlanan tüm özellikler türetilmiş sınıfta kullanılabilir.
Türetilmiş bir sınıf, devralınan bir özelliği sınıf tanımında yeniden tanımlayarak geçersiz kılabilir. Türetilmiş sınıftaki özelliği, varsa yeniden tanımlı türü ve varsayılan değeri kullanır. Devralınan özellik varsayılan bir değer tanımladıysa ve yeniden tanımlanan özellik tanımlamıyorsa, devralınan özelliğin varsayılan değeri yoktur.
Türetilmiş bir sınıf statik özelliği geçersiz kılmazsa, türetilmiş sınıf aracılığıyla statik özelliğe erişmek temel sınıfın statik özelliğine erişir. Türetilmiş sınıf aracılığıyla özellik değerinin değiştirilmesi, temel sınıftaki değeri değiştirir. Statik özelliği geçersiz kılmayan diğer türetilmiş herhangi bir sınıf da temel sınıfta özelliğinin değerini kullanır. Özelliği geçersiz kılmayan bir sınıfta devralınan statik özelliğin değerinin güncelleştirilmesi, aynı temel sınıftan türetilen sınıflar için istenmeyen etkilere neden olabilir.
Aşağıdaki örnekte türetilmiş sınıflardaki statik ve örnek özelliklerine yönelik davranış gösterilmektedir.
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
Sınıfı varsayılan bir değer ayarlamadan özelliği yeniden tanımladığından DerivedClassC için InstanceProperty boş bir dizedir. DerivedClassD için değerin nedeni, sınıfın özelliği varsayılan değer olarak bu dizeyle yeniden tanımlamasıdırOverride
.
"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 dışında, türetilmiş sınıfların statik özelliğinin değeri temel sınıfla aynıdır, çünkü bunlar özelliği yeniden tanımlamaz. Bu, doğrudan BaseClass yerine DerivedClassB'den devralan DerivedClassC için bile geçerlidir.
[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'ye DerivedClassA aracılığıyla erişildiğinde ve değiştirildiğinde, değiştirilen değer DerivedClassD dışında her sınıfı etkiler.
Kapsamlı bir örnek de dahil olmak üzere sınıf devralma hakkında daha fazla bilgi için bkz . about_Classes_Inheritance.
Özellik özniteliklerini kullanma
PowerShell, veri türü bilgilerini geliştirmek ve bir özelliğe atanan verileri doğrulamak için kullanabileceğiniz çeşitli öznitelik sınıfları içerir. Doğrulama öznitelikleri, özelliklere verilen değerlerin tanımlı gereksinimleri karşıladığını test etmenizi sağlar. Doğrulama, değer atandığı anda tetikler.
Kullanılabilir öznitelikler hakkında daha fazla bilgi için bkz . about_Functions_Advanced_Parameters.
Update-TypeData ile örnek özelliklerini tanımlama
Özellikleri doğrudan sınıf tanımında bildirmenin ötesinde, cmdlet'ini kullanarak statik oluşturucudaki bir sınıfın örneklerinin Update-TypeData
özelliklerini tanımlayabilirsiniz.
Bu kod parçacığını desen için başlangıç noktası olarak kullanın. Köşeli ayraç içindeki yer tutucu metni gerektiği gibi değiştirin.
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
}
}
}
İpucu
Add-Member
Cmdlet, statik olmayan oluşturuculardaki bir sınıfa özellik ve yöntemler ekleyebilir, ancak oluşturucu her çağrıldığında cmdlet çalıştırılır. Update-TypeData
Statik oluşturucuda kullanmak, sınıfa üye ekleme kodunun oturumda yalnızca bir kez çalıştırılmasını sağlar.
Yalnızca ile tanımlanamayan Update-TypeData
statik olmayan oluşturucularda sınıfına salt okunur özellikler gibi özellikler ekleyin.
Diğer ad özelliklerini tanımlama
Diğer Ad özniteliği, bir sınıf özelliği bildiriminde kullanıldığında hiçbir etkiye sahip değildir. PowerShell yalnızca cmdlet, parametre ve işlev adları için diğer adları tanımlamak için bu özniteliği kullanır.
Sınıf özelliği için bir diğer ad tanımlamak için MemberType ile kullanın Update-TypeData
AliasProperty
.
Örneğin, OperablePair sınıfının bu tanımı sırasıyla LeftHandSide ve RightHandSide diğer adlarıyla x ve y tamsayı özelliklerini tanımlar.
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 }
}
Diğer adlar tanımlandığında, kullanıcılar özelliklere iki adla da erişebilir.
$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
Hesaplanan özellikleri tanımlama
Diğer özelliklerin değerlerine başvuran bir özellik tanımlamak için MemberType ile cmdlet'ini ScriptProperty
kullanınUpdate-TypeData
.
Örneğin Budget sınıfının bu tanımı Expenses ve Revenues özelliklerini kayan noktalı sayıların dizisi olarak tanımlar. Toplam giderlerin Update-TypeData
, toplam gelirlerin ve net gelirin hesaplanan özelliklerini tanımlamak için cmdlet'ini kullanır.
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}
Özel alma ve ayarlama mantığıyla özellikleri tanımlama
PowerShell sınıf özellikleri özel alıcı ve ayarlayıcı mantığını doğrudan tanımlayamaz. Anahtar sözcüğüyle hidden
bir backing özelliği tanımlayarak ve değerini almak ve ayarlamak için özel mantıkla görünür bir özellik tanımlamak için komutunu kullanarak Update-TypeData
bu işlevi yaklaşık olarak belirleyebilirsiniz.
Kurala göre, alt çizgi ön ekiyle gizli yedekleme özelliği adını tanımlayın ve deve büyük/küçük harflerini kullanın. Örneğin, yerine TaskCount
gizli yedekleme özelliğini _taskCount
olarak adlandırın.
Bu örnekte ProjectSize sınıfı, _value adlı gizli bir tamsayı özelliğini tanımlar. _value özelliğini almak ve ayarlamak için Özel mantık ile Değeri olarak ScriptProperty
tanımlar. Ayarlayıcı betik bloğu, projenin dize gösterimini doğru boyuta dönüştürmeyi işler.
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
}
}
Özel alıcı ve ayarlayıcı tanımlandığında, Value özelliğini tamsayı veya dize olarak ayarlayabilirsiniz.
$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
Sınırlamalar
PowerShell sınıf özellikleri aşağıdaki sınırlamalara sahiptir:
Statik özellikler her zaman değişebilir. PowerShell sınıfları sabit statik özellikleri tanımlayamaz.
Geçici çözüm: Yok.
Sınıf özelliği öznitelik bağımsız değişkenlerinin sabit olması gerektiğinden özellikler ValidateScript özniteliğini kullanamaz.
Geçici çözüm: ValidateArgumentsAttribute türünden devralan bir sınıf tanımlayın ve bunun yerine bu özniteliği kullanın.
Doğrudan bildirilen özellikler özel alıcı ve ayarlayıcı uygulamaları tanımlayamaz.
Geçici çözüm: Gizli bir özellik tanımlayın ve görünür alıcı ve ayarlayıcı mantığını tanımlamak için kullanın
Update-TypeData
.Özellikler Diğer Ad özniteliğini kullanamaz. özniteliği yalnızca parametreler, cmdlet'ler ve işlevler için geçerlidir.
Geçici çözüm: Sınıf oluşturucularında diğer adları tanımlamak için cmdlet'ini kullanın
Update-TypeData
.Bir PowerShell sınıfı cmdlet'i ile
ConvertTo-Json
JSON'a dönüştürüldüğünde, çıkış JSON'ı tüm gizli özellikleri ve değerlerini içerir.Geçici çözüm: Yok
Ayrıca bkz.
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin