2010-09-03 4 views
7

Je définis un type PowerShell personnalisé avec New-Object. Je voudrais qu'un paramètre soit de mon type défini, est-il possible de spécifier ce type de façon déclarative? Le code suivant me donne l'erreur: "Impossible de trouver le type [BuildActionContext]: assurez-vous que l'assembly contenant ce type est chargé."Utiliser un type défini PowerShell personnalisé pour la spécification du type de paramètre

Pouvons-nous spécifier le type déclaratif, ou devrais-je simplement tester le type de l'objet spécifié?

Non Code de travail:

$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 

Code de travail, mais peut-il être fait différemment:

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

Note: deuxième appel donne le message d'exception.

Répondre

6

Je m'attendrais à ce que seuls les types .NET réels puissent être utilisés pour spécifier le type de paramètre. Selon Essential PowerShell: Name your custom object types les noms de type personnalisé sont principalement utilisés pour le formatage.

Vous pouvez vérifier les noms de type manuellement via ValidateScript attribut:

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

droit, Nouveau-objet ne crée pas les types, il crée des instances de types. Vous pouvez utiliser Add-Type pour créer un type avec C# ou VB.NET. – JasonMArcher

+0

La phrase "Si vous vérifiez les noms de types manuellement, vous pouvez utiliser des attributs pour cela:" est vraiment déroutant. Je ne suis pas sûr de ce que l'auteur essaie de transmettre, et ce n'est pas évident pour moi dans le code. –

+0

Omg, ça fait déjà 6 ans .. Je vais essayer d'éditer la phrase. – stej

0

Bonne question. J'ai essayé

$buildActionContext -is [BuildActionContext] 

et obtenir

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

Quelle est l'erreur que vous obtenez dans le premier exemple. En haut de ma tête je voudrais créer un objet C# pour ce type, mais c'est probablement trop.

Je vais continuer à chercher.

Questions connexes