Функция PowerShell не возвращает объект - PullRequest
4 голосов
/ 02 июня 2010

У меня есть простая функция, которая создает общий список:

function test()
{
    $genericType = [Type] "System.Collections.Generic.List``1"
    [type[]] $typedParameters = ,"System.String"
    $closedType = $genericType.MakeGenericType($typedParameters)
    [Activator]::CreateInstance($closedType)
}

$a = test

Проблема в том, что $a всегда равно нулю, что бы я ни пытался. Если я выполняю тот же код за пределами функции, он работает правильно.

Мысли

Ответы [ 2 ]

8 голосов
/ 03 июня 2010

ИМХО, это ловушка № 1. Если вы возвращаете объект из функции, которая как-то перечислима (я не знаю точно, является ли реализация IEnumerable единственным случаем), PowerShell развертывает объект и возвращает элементы в нем.

Ваш недавно созданный список был пуст, поэтому ничего не было возвращено. Чтобы заставить это работать, просто используйте это:

,[Activator]::CreateInstance($closedType)

Это создаст массив из одного элемента, который будет развернут, и элемент (общий список) будет присвоен $a.

Дополнительная информация

Вот список похожих вопросов, которые помогут вам понять, что происходит:


Примечание : вам не нужно объявлять заголовок функции с круглыми скобками. Если вам нужно добавить параметры, функция будет выглядеть так:

function test {
 param($myParameter, $myParameter2)
}

или

function  {
param(
  [Parameter(Mandatory=true, Position=0)]$myParameter,
  ... again $myParameter2)
...
3 голосов
/ 03 июня 2010

Более простой способ работы с дженериками. Это напрямую не решает подход [Activator], хотя

Function test
{
    New-Object "system.collections.generic.list[string]"
}

(test).gettype()
...