Использовать пользовательский тип, определенный PowerShell, для спецификации типа параметра - PullRequest
8 голосов
/ 03 сентября 2010

Я определяю пользовательский тип PowerShell с помощью New-Object. Я хотел бы, чтобы параметр был моего определенного типа, возможно ли указать этот тип декларативным способом? Следующий код дает мне сообщение об ошибке: «Невозможно найти тип [BuildActionContext]: убедитесь, что загружена сборка, содержащая этот тип.»

Можем ли мы указать декларативный тип или просто проверить тип указанного объекта?

Не рабочий код:

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

Примечание: второй вызов выдает сообщение об исключении.

Ответы [ 2 ]

6 голосов
/ 05 сентября 2010

Я ожидаю, что только реальные типы .NET могут быть использованы для указания типа параметра.В соответствии с Essential PowerShell: присвойте именам типы пользовательских объектов имена пользовательских типов в основном используются для форматирования.

Вы можете проверить имена типов вручную с помощью атрибута ValidateScript:

function DoSomethingWithBuildActionContext { 
  param(
    [Parameter()]
    [ValidateScript({ $_.PSObject.TypeNames[0] -eq 'BuildActionContext' })]
    $context
  )
  Write-Host "Build action: $($Context.BuildAction)"
}
0 голосов
/ 03 сентября 2010

Отличный вопрос. Я пытался

$buildActionContext -is [BuildActionContext]

и получите

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

Какую ошибку вы получите в первом примере. Мне бы хотелось создать объект C # для этого типа, но это, вероятно, излишне.

Я буду продолжать поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...