2010-09-03 13 views
7

Defino un tipo de PowerShell personalizado con New-Object. Me gustaría que un parámetro sea de mi tipo definido, ¿es posible especificar este tipo de manera declarativa? El siguiente código me da el error: "No se puede encontrar el tipo [BuildActionContext]: asegúrese de que el ensamblaje que contiene este tipo esté cargado".Use el tipo definido de PowerShell personalizado para la especificación de tipo de parámetro

¿Podemos especificar el tipo declarativo, o debería simplemente probar el tipo del objeto especificado?

No es el código de trabajo:

$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 

código de trabajo, pero puede hacerse de otra manera:

$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" 

Nota: Segunda convocatoria da el mensaje de excepción.

Respuesta

6

Espero que solo los tipos .NET reales se puedan usar para especificar el tipo de parámetro. De acuerdo con Essential PowerShell: Name your custom object types, los nombres de tipos personalizados se usan principalmente para formatear.

Puede comprobar los nombres de tipo manual a través de ValidateScript atributo:

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

derecha, New-Object no crea tipos, que crea instancias de tipos. Puede usar Add-Type para crear un tipo con C# o VB.NET. – JasonMArcher

+0

La frase "Si va a verificar los nombres de tipo manualmente, puede usar atributos para eso:" es realmente confuso. No estoy seguro de lo que el autor está tratando de transmitir, y no es evidente para mí en el código. –

+0

Omg, eso ya son 6 años .. Trataré de editar la oración. – stej

0

Una gran pregunta. Probé

$buildActionContext -is [BuildActionContext] 

y obtener

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

¿Cuál es el error que se obtiene en el primer ejemplo. Me gustaría crear un objeto C# para ese tipo, pero probablemente sea excesivo.

Voy a seguir buscando.

Cuestiones relacionadas