我有一个复杂类,它基于通过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]]
的示例来解决这个问题,但是有人能解释一下这是怎么回事吗?或者更好的是,如何修复所有数据类型的代码?
1条答案
按热度按时间soat7uwm1#
正如注解中所解释的,问题不在于
BindingList
,而在于枚举脚本块的输出。由于调用.DefineData($OriginalValue)
时BindingList
没有元素,因此通过.ScriptProperty
枚举没有元素的列表会导致空值:一个简单的解决方法是在输出之前将输出 Package 在单个元素数组中,为此可以使用逗号操作符
,
。因此,考虑到不需要
hashtable
属性,您的class
方法可能如下所示: