以编程方式在Class Ctor中设置公共财产

时间:2019-01-28 14:07:45

标签: powershell powershell-v5.0

我想以编程方式在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。

请帮助

1 个答案:

答案 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 ...
    • AND ,还没有一个类型为[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'}