我想以编程方式在PowerShell V5.0中的类的构造函数中设置一个公共属性。测试类具有许多公共属性,具体取决于传递给该类的构造函数的对象(通常称为“ $ something”)
我认为,如果创建一个公共属性名称数组,可以访问并迭代它们,这将节省大量代码,因为设置公共属性的值只是在$ something对象上调用相同的方法传递给它。
在每个范围上尝试使用Set-Variable cmdlet(我认为这是本地范围)。可以通过在构造函数中手动设置每个公共属性来完成,但是我希望能够缩短它。
Class TestClass
{
[STRING]$PublicProperty
[STRING]$PublicProperty1
... ... ... #Loads more properties
[STRING]$PublicProperty50
#An array that contains name for public properties
[ARRAY]$ArrayOfPublicProperties = @("PublicProperty", "PublicProperty1"...)
TestClass($something)
{
foreach ($property in $this.ArrayOfPublicProperties)
{
Set-Variable -Name "$($property.Name)" -Scope Local -Value $($something.GetValue(#blablabla))
}
}
}
我希望能够遍历公共数组(这是总代码,但它适用于我所处的情况,我不了解其他方法),并使用Set设置变量-变量cmdlet。相反,它没有设置任何内容。我确定我过去做过类似的事情,以编程方式创建和设置变量等... idk。
请帮助
答案 0 :(得分:0)
Set-Variable
仅适用于常规变量,不适用于属性。
您必须通过.psobject.properties
使用反射,这也消除了对$ArrayOfPublicProperties
助手属性的需要:
Class TestClass
{
[string]$PublicProperty
[string]$PublicProperty1
# ...
TestClass($something)
{
# Loop over all properties of this class.
foreach ($prop in $this.psobject.Properties)
{
$prop.Value = $something.GetValue(#blablabla)
}
}
}
但是,请注意, PowerShell方便地通过 hashtable 或(自定义)对象的 cast 构造和初始化对象< / em>具有匹配属性 。
注意事项:要使之起作用:
OR ,如果有 构造函数:
Cannot convert ... to type ...
[object]
或[hashtable]
的单参数构造器(隐含)一个 hashtable 强制转换参数,[psobject]
/ [pscustomobject]
很好)。
输入哈希表/对象的属性名称集必须是目标类的属性的子集;换句话说:输入对象不得包含目标类中也不存在的属性,但所有目标类属性也必须不存在。 p>
应用于您的示例(请注意,不再有显式构造函数,因为原始构造函数TestClass($something)
会破坏功能,因为$something
是隐式[object]
-类型的) :
Class TestClass
{
[string]$PublicProperty
[string]$PublicProperty1
# ...
# Note: NO (explicit) constructor is defined.
}
# Construct a [TestClass] instance and initialize its properties
# from a hashtable, using a cast.
[TestClass] @{ PublicProperty = 'p0'; PublicProperty1 = 'p1'}