powershell 无法从脚本属性返回[绑定列表[随机类型]]

sshcrbum  于 2023-03-02  发布在  Shell
关注(0)|答案(1)|浏览(148)

我有一个复杂类,它基于通过Import-Clixml加载的文件动态地向自身添加成员。
将类归结为有问题的部分会给我们留下这样的 (注意用于证明到那时为止成功的注解行)

class TestClass {
    [hashtable]$_data = @{}
    [void]DefineData([object]$data) {
        $this._data['Data'] = $data
        $this | Add-Member -MemberType ScriptProperty -Name 'ScriptProperty' -Value {
            #$this._data['Data'].GetType() | Out-Host
            return $this._data['Data']
        }
    }
}

在以下代码中,有4个语句用于为$OriginalValue赋值。请注解其中3个语句,并取消注解要尝试的语句。执行代码时,该代码应生成包含与$OriginalValue相同的值的$ReturnValue,但在为$OriginalValue赋值[BindingList[RandomType]]示例的情况下,$ReturnValue$null

$ClassVar = [TestClass]::new()

$OriginalValue = [System.ComponentModel.BindingList[string]]::new()
#$OriginalValue = @{}
#$OriginalValue = [PSCustomObject]@{ Name = 'Value' }
#$OriginalValue = "Test String"

$OriginalValue.GetType()
$ClassVar.DefineData($OriginalValue)

$ReturnValue = $ClassVar.ScriptProperty
$ReturnValue.GetType()

是的,我可以通过在[hashtable]中存储[BindingList[RandomType]]的示例来解决这个问题,但是有人能解释一下这是怎么回事吗?或者更好的是,如何修复所有数据类型的代码?

soat7uwm

soat7uwm1#

正如注解中所解释的,问题不在于BindingList,而在于枚举脚本块的输出。由于调用.DefineData($OriginalValue)BindingList没有元素,因此通过.ScriptProperty枚举没有元素的列表会导致空值:

(& { [System.ComponentModel.BindingList[string]]::new() }).GetType()

# Errors with:
# InvalidOperation: You cannot call a method on a null-valued expression.

一个简单的解决方法是在输出之前将输出 Package 在单个元素数组中,为此可以使用逗号操作符,

(& { , [System.ComponentModel.BindingList[string]]::new() }).GetType()

# Output type is preserved and the wrapping array is lost due to enumeration

因此,考虑到不需要hashtable属性,您的class方法可能如下所示:

class TestClass {
    [void] DefineData([object] $data) {
        $this.PSObject.Properties.Add(
            [psscriptproperty]::new(
                'ScriptProperty',
                { , $data }.GetNewClosure()
            )
        )
    }
}

相关问题