2010-09-03 99 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#对象的类型,但这可能是矫枉过正。

我会继续搜索。