Class 在Get和Set块中动态检索ScriptProperty的名称 目标

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

我希望利用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
$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来完成。假设class
Bar
是用两种方法定义的,它们实现了访问字段的一般方法:

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动态生成脚本块来完成。假设class
Bar
是用两种方法定义的,它们实现了访问字段的一般方法:

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)