Question:
I define a custom PowerShell type with New-Object. I would like a parameter to be of my defined type, is it possible to specify this type in a declarative way? The following code gives me the error: “Unable to find type [BuildActionContext]: make sure that the assembly containing this type is loaded.”
Can we specify the type declarative, or should I just test the type of the specified object?
Not working code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$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 |
Working code, but can it be done differently:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$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: Second call gives the exception message.
Answer:
I would expect that only real .NET types can be used to specify parameter type. According to Essential PowerShell: Name your custom object types the custom type names are mainly used for formatting.
You can check the type names manually via ValidateScript
attribute:
1 2 3 4 5 6 7 8 9 |
function DoSomethingWithBuildActionContext { param( [Parameter()] [ValidateScript({ $_.PSObject.TypeNames[0] -eq 'BuildActionContext' })] $context ) Write-Host "Build action: $($Context.BuildAction)" } |