$this Powershell 中嵌套自定义对象的对象引用



在尝试在Powershell中执行对象引用时,我似乎无法完全理解一些事情。不确定我是否错过了什么。

说明此问题的示例代码如下所示:

function Create-Custom-Object {
    $oResult = New-Object -TypeName PSObject -Property (@{
        "Test"          = $(Get-Date);
    })
    Add-Member -memberType ScriptMethod -InputObject $oResult -Name "GetTest" -Value {
        return $this.Test;
    }
    return $oResult
}
function Create-Wrapper-Object {
    $oObject = $(Create-Custom-Object)
    $oResult = New-Object -TypeName PSObject -Property (@{
        "Object"             = $oObject;
        "Test"               = $(Get-Date);
    })
    Add-Member -MemberType ScriptMethod -InputObject $oResult -Name "WrapTest" -Value {
        return $this.Object.GetTest()
    }
    return $oResult
}
$oCustom = Create-Custom-Object
sleep 5
$oWrapper = Create-Wrapper-Object
echo "Custom-Test: $($oCustom.Test)"
echo "Wrapper-Test: $($oWrapper.Test)"
echo "GetTest: $($oCustom.GetTest())"
echo "WrapTest: $($oWrapper.WrapTest())"

运行时,输出如下:

>powershell -file test.ps1
Custom-Test: 11/20/2017 16:10:19
Wrapper-Test: 11/20/2017 16:10:24
GetTest: 11/20/2017 16:10:19
WrapTest: 11/20/2017 16:10:24

让我感到困惑的是,对包装对象 WrapTest(( 的调用从包装对象而不是嵌入式自定义对象返回"Test"属性值。为什么Powershell会这样?

我怀疑这里的问题(基于sleep 5的假设意图(是$oCustom被分配了一个自定义对象,然后在 5 秒后$oWrapper被分配了一个包装对象,其中包含一个新的自定义对象,该对象具有基本相同的[DateTime]值(到最接近的秒(,而不是(预期的? (先前创建的$oCustomWrapTest() 返回的不是$oWrapperTest成员,而是返回其自己的自定义对象$oWrapper.Object中无法区分的Test成员。为了创建一个(通用(包装器对象,你需要一些东西来包装,否则它实际上只是一个(特定的(嵌套对象。像这样:

function Create-Wrapper-Object {
param ($ObjectToWrap)
  $oResult = New-Object -TypeName PSObject -Property (@{
    "Object"             = $ObjectToWrap; # presumably with a GetTest() method
    "Test"               = $(Get-Date);   # remember the time of wrapping
  })
  Add-Member -MemberType ScriptMethod -InputObject $oResult -Name "WrapTest" -Value {
    return $this.Object.GetTest()
  }
  return $oResult
}

对于(假设是(期望的结果:

$oCustom = Create-Custom-Object
sleep 5
$oWrapper = Create-Wrapper-Object $oCustom
echo "Custom-Test: $($oCustom.Test)"
Custom-Test: 05/31/2021 08:52:30
echo "Wrapper-Test: $($oWrapper.Test)"
Wrapper-Test: 05/31/2021 08:52:35
echo "GetTest: $($oCustom.GetTest())"
GetTest: 05/31/2021 08:52:30
echo "WrapTest: $($oWrapper.WrapTest())"
WrapTest: 05/31/2021 08:52:30

最新更新