Class 在Get和Set块中动态检索ScriptProperty的名称 目标
我希望利用PowerShell 5新的Class 在Get和Set块中动态检索ScriptProperty的名称 目标,class,powershell,powershell-5.0,Class,Powershell,Powershell 5.0,我希望利用PowerShell 5新的类功能创建一个类,我可以在项目中使用该类查看数据库记录,并创建将外键链接和取消链接在一起的方法 下面的类正在处理2个属性,但我需要添加更多属性,不想复制/粘贴,这就是它当前的工作方式: # Create a new instance of my Computer class $computer = [Computer]::new([int]71) # Change the status of the Server in the DataRow $compu
类
功能创建一个类,我可以在项目中使用该类查看数据库记录,并创建将外键链接和取消链接在一起的方法
下面的类正在处理2个属性,但我需要添加更多属性,不想复制/粘贴,这就是它当前的工作方式:
# Create a new instance of my Computer class
$computer = [Computer]::new([int]71)
# Change the status of the Server in the DataRow
$computer.Status = "Active"
# Update the Row in the Database
$computer.SaveChanges()
# Link this Server in the Database to a record in the Locations table
$computer.LinkLocation([int]16)
我已经实现了类
部分,甚至实现了一些方法
,但我想知道是否可以通过引用脚本属性
的名称
属性来减少类中所需的代码量
等级
解释
这个类本质上包装了DataRow
和DataAdapter
,以便在ScriptProperty
直接修改DataRow
上的值时方便地查看和更新记录,Savechanges
方法使用DataAdapter
问题
对于我想在类中包装的每个属性,我需要使用Getter
和Setter
创建一个ScriptProperty
,上面的类有2个属性,看起来不坏,但是如果我的SQL表有40个属性呢?我真的不想复制并粘贴$this | Add Member…
行40次
理想情况下,我正在寻找一种方法来循环并动态创建每个ScriptProperty
尝试
编辑
高度简化的示例:
class Computer
{
hidden [int]$number3 = 4
hidden [int]$number2 = 13
hidden ExtractFields([string]$propertyName)
{
$this | Add-Member -MemberType ScriptProperty -Name $propertyName -Force -Value `
{
$this.GetValue($propertyName)
} `
{
param
(
$value
)
$this.SetValue($propertyName,$value)
}
}
hidden [object] GetValue($propertyName)
{
return $this.$propertyName
}
hidden SetValue($propertyName, $value)
{
$this.$propertyName = $value
}
Computer()
{
foreach($property in @('number2', 'number3'))
{
$this.ExtractFields($property)
}
}
}
尝试设置动态属性时收到错误(例如“$computer.number2=17)
问题:
有没有一种方法可以基于指定的属性名动态创建ScriptProperty
?这可以通过为setter和getter动态生成scriptblock来完成。假设classBar
是用两种方法定义的,它们实现了访问字段的一般方法:
class Bar
{
[object] GetFieldValue ( [string] $FieldName )
{
# replace this with code that looks up your value by field name
Write-Host "Invoked GetFieldValue($FieldName)"
return "value of $FieldName"
}
SetFieldValue ( [string] $FieldName, [object] $Value )
{
# replace this with code that sets your field value
Write-Host "Invoked SetFieldValue($FieldName,$Value)"
}
}
然后可以实现一个函数,用动态生成的属性装饰Bar
对象,这些属性具有调用这些方法的getter和setter:
function New-Bar
{
param( [string[]]$FieldNames )
# create the new object
$outputObject = [Bar]::new()
# add a property for each field
foreach ( $fieldName in $FieldNames )
{
$getter = [scriptblock]::Create(
"`$this.GetFieldValue('$fieldName')"
)
$setter = [scriptblock]::Create(
"`param(`$p) `$this.SetFieldValue('$fieldName',`$p)"
)
$outputObject |
Add-Member ScriptProperty $fieldName $getter $setter -Force
}
# return the object
$outputObject
}
然后可以如下方式访问字段:
$b = New-Bar 'field1','field2'
$b.field1 = 'my value for field 1'
$b.field1
哪些产出:
Invoked GetFieldValue(field1)
value of field1
Invoked SetFieldValue(field1,my value for field 1)
这可以通过为setter和getter动态生成脚本块来完成。假设classBar
是用两种方法定义的,它们实现了访问字段的一般方法:
class Bar
{
[object] GetFieldValue ( [string] $FieldName )
{
# replace this with code that looks up your value by field name
Write-Host "Invoked GetFieldValue($FieldName)"
return "value of $FieldName"
}
SetFieldValue ( [string] $FieldName, [object] $Value )
{
# replace this with code that sets your field value
Write-Host "Invoked SetFieldValue($FieldName,$Value)"
}
}
然后可以实现一个函数,用动态生成的属性装饰Bar
对象,这些属性具有调用这些方法的getter和setter:
function New-Bar
{
param( [string[]]$FieldNames )
# create the new object
$outputObject = [Bar]::new()
# add a property for each field
foreach ( $fieldName in $FieldNames )
{
$getter = [scriptblock]::Create(
"`$this.GetFieldValue('$fieldName')"
)
$setter = [scriptblock]::Create(
"`param(`$p) `$this.SetFieldValue('$fieldName',`$p)"
)
$outputObject |
Add-Member ScriptProperty $fieldName $getter $setter -Force
}
# return the object
$outputObject
}
然后可以如下方式访问字段:
$b = New-Bar 'field1','field2'
$b.field1 = 'my value for field 1'
$b.field1
哪些产出:
Invoked GetFieldValue(field1)
value of field1
Invoked SetFieldValue(field1,my value for field 1)