【问题标题】:Creating a method to execute based off instance?创建基于实例执行的方法?
【发布时间】:2021-09-22 22:39:27
【问题描述】:

是否存在诸如在类中创建一个方法以根据其中一个填充字段执行某些操作?有点像静态方法。

只是想创建我自己的 Ping() 方法,但希望它只使用已填充的 ComputerName 属性。

Class Device {
    
    [string]$ComputerName
    [string]$Status
    [string]$Manufacturer
    [string]$Model
    [string]$SerialNumber

    [Void]Ping($ComputerName) {
        
        $Echo_Reply = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet

        $this.Status = $Echo_Reply

    }

}

如果我实例化它,为属性分配一个计算机名称,我可以直接使用我的 Ping() 方法而不引用它来实际 ping 吗?

  • $Device = [device]::new()
  • $Device.ComputerName = 'ComputerOne'

我可以用我的方法ping它:$Device.Ping(),而不是引用它$Device.Ping('ComputerOne')

【问题讨论】:

  • 我对 PowerShell 中的类并没有做太多(/任何事情),但docs.microsoft.com/en-us/powershell/module/… 的文档建议$this.ComputerName 是您正在寻找读取属性值的语法,只是就像你用$this.Status 设置一个一样。
  • 您好,我的思考过程与我尝试过的过程相同。只是抛出一个 overload 异常。

标签: powershell powershell-5.1


【解决方案1】:
  • 您正在寻找一个 instance 方法,而不是 static 方法,即一种可以隐式操作特定状态的class 的实例。

  • 您问题中的代码定义一个实例方法,并且正如mclayton 指出的那样,您必须使用$this.<property-name> 从实例内部引用实例的属性方法,因此您的方法可以重新定义为:

    [void] Ping() {        
      $this.Status = Test-Connection -ComputerName $this.ComputerName -Count 1 -Quiet
    }
    
  • 陷阱,从 PowerShell Core 7.2.0-preview.7 开始:

    • 如果在您的脚本中直接定义您的class 之后,您稍后尝试通过@987654323 在同一脚本中重新定义它 @ (. <script>),重新定义被悄悄地忽略

      • 可以说,在相同范围内的这种重新定义应该完全阻止,如果你尝试重新定义同一个类就已经是这种情况了直接在给定的范围内。
      • GitHub issue #8767
    • 如有疑问,请启动新会话以确保您的类的最新定义生效

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多