2010-09-03 101 views
7

我使用New-Object定義了一個定製的PowerShell類型。我想要一個參數爲我定義的類型,是否可以用聲明方式指定此類型?下面的代碼給我錯誤:「無法找到類型[BuildActionContext]:確保包含此類型的程序集已加載。」使用定製的PowerShell定義的類型來定義參數類型

我們可以指定聲明的類型,還是應該測試指定對象的類型?

不工作代碼:

$buildActionContext = New-Object -TypeName PSObject -Property @{ 
# Given properties 
BuildAction = "Build"; 
} 
$buildActionContext.PSObject.TypeNames.Insert(0, 'BuildActionContext') 

function DoSomethingWithBuildActionContext 
{ 
[CmdletBinding()] 
param 
(
    [Parameter(Mandatory=$true)][BuildActionContext]$Context 
) 

Write-Host "Build action: $($Context.BuildAction)" 
} 

DoSomethingWithBuildActionContext -Context $buildActionContext 

工作的代碼,但它可以被不同的做法:

$buildActionContext = New-Object -TypeName PSObject -Property @{ 
     # Given properties 
     BuildAction = "Build"; 
    } 
    $buildActionContext.PSObject.TypeNames.Insert(0, 'BuildActionContext') 

function DoSomethingWithBuildActionContext 
{ 
    [CmdletBinding()] 
    param 
    (
     [Parameter(Mandatory=$true)]$Context 
    ) 

    if ($Context.PSObject.TypeNames[0] -ne 'BuildActionContext') 
    { 
     throw "Context parameter not of type 'BuildActionContext'" 
    } 

    Write-Host "Build action: $($Context.BuildAction)" 
} 

DoSomethingWithBuildActionContext -Context $buildActionContext 
DoSomethingWithBuildActionContext -Context "Hello world" 

注:第二個電話給異常消息。

回答

6

我希望只有真正的.NET類型可以用來指定參數類型。根據Essential PowerShell: Name your custom object types自定義類型名稱主要用於格式。

您可以通過ValidateScript屬性手動檢查類型名稱:

function DoSomethingWithBuildActionContext { 
    param(
    [Parameter()] 
    [ValidateScript({ $_.PSObject.TypeNames[0] -eq 'BuildActionContext' })] 
    $context 
) 
    Write-Host "Build action: $($Context.BuildAction)" 
} 
+1

右鍵,新對象不創建類型,它創建的類型的實例。您可以使用Add-Type使用C#或VB.NET創建一個類型。 – JasonMArcher 2010-09-07 17:34:20

+0

句子「如果你手動檢查類型名稱,你可以使用屬性:」真是令人困惑。我不確定作者想傳達什麼,而且在代碼中對我來說並不明顯。 – 2016-07-08 14:57:23

+0

Omg,這已經是6年了。我會嘗試編輯這個句子。 – stej 2016-07-15 06:11:42

0

偉大的問題。我試圖

$buildActionContext -is [BuildActionContext] 

並獲得

Unable to find type [BuildActionContext]: make sure that the assembly containing this type is loaded. 

這是你的第一個例子中得到的錯誤。關閉我的頭頂,我想創建一個C#對象的類型,但這可能是矯枉過正。

我會繼續搜索。