在Instantiation上为PowerShell类设置属性

时间:2017-05-17 21:23:01

标签: class powershell

是否可以在不使用构造函数的情况下在实例化中定义PowerShell类的属性值?

假设有一个cmdlet将返回Jon Snow的当前状态(活着或死亡)。我希望该cmdlet将该状态分配给我的类中的属性。

我可以使用构造函数执行此操作,但无论使用哪种构造函数,我都希望这种情况发生,或者甚至确实使用构造函数。

function Get-JonsCurrentStatus {
    return "Alive"
}

Class JonSnow {

    [string]
    $Knowledge

    [string]
    $Status

    #Constructor 1
    JonSnow()
    {
        $this.Knowledge = "Nothing"
        $this.Status = Get-JonsCurrentStatus
    }

    #Constructor 2
    JonSnow([int]$Season)
    {
        if ($Season -ge 6) 
        {
            $this.Knowledge = "Still nothing"
            $this.Status = Get-JonsCurrentStatus #I don't want to have to put this in every constructor
        }
    }

}

$js = [JonSnow]::new()
$js

2 个答案:

答案 0 :(得分:2)

不幸的是,您无法使用: this() 调用相同类中的其他构造函数(尽管您可以调用具有: base() [1]

的基类构造函数

您最好的选择是使用(隐藏)帮助程序解决方法:

function Get-JonsCurrentStatus {
    return "Alive"
}

Class JonSnow {

    [string]
    $Knowledge

    [string]
    $Status

    # Hidden method that each constructor must call
    # for initialization.
    hidden Init() {
      $this.Status = Get-JonsCurrentStatus
    }

    #Constructor 1
    JonSnow()
    {
        # Call shared initialization method.
        $this.Init()
        $this.Knowledge = "Nothing"
    }

    #Constructor 2
    JonSnow([int]$Season)
    {
        # Call shared initialization method.
        $this.Init()
        if ($Season -ge 6) 
        {
            $this.Knowledge = "Still nothing"
        }
    }

}

$js = [JonSnow]::new()
$js

[1] 按设计限制的原因为provided by a member of the PowerShell team

  

我们没有添加:this()语法,因为有一个合理的替代方案,也是一种更直观的语法方式

然后,链接的评论会推荐此答案中使用的方法。

答案 1 :(得分:0)

您可以通过以下方式初始化类属性:

$jon = new-object JonSnow -Property @{"Status" = Get-JonsCurrentStatus; "Knowledge" "Nothing"}