Функция PowerShell не возвращает объект
У меня есть простая функция, которая создает общий список:
function test()
{
$genericType = [Type] "System.Collections.Generic.List``1"
[type[]] $typedParameters = ,"System.String"
$closedType = $genericType.MakeGenericType($typedParameters)
[Activator]::CreateInstance($closedType)
}
$a = test
Проблема в том, что $a
всегда равно нулю, что бы я ни пытался. Если я выполняю тот же код за пределами функции, он работает правильно.
Мысли?
2 ответа
ИМХО, это подводный камень #1. Если вы возвращаете объект из функции, которая как-то перечислима (я не знаю точно, если реализация IEnumerable
является единственным случаем), PowerShell разворачивает объект и возвращает элементы в нем.
Ваш недавно созданный список был пуст, поэтому ничего не было возвращено. Чтобы заставить это работать просто используйте это:
,[Activator]::CreateInstance($closedType)
Это создаст массив из одного элемента, который будет развернут, и элемент (общий список) будет назначен $a
,
Дальнейшая информация
Вот список похожих вопросов, которые помогут вам понять, что происходит:
- Подводные камни
- Предотвращение сплющивания Agnostic Jagged Array в Powershell
- Странное поведение в функции PowerShell, возвращающей DataSet/DataTable
- Что определяет, развернет ли конвейер Powershell коллекцию?
Примечание: вам не нужно объявлять заголовок функции с круглыми скобками. Если вам нужно добавить параметры, функция будет выглядеть так:
function test {
param($myParameter, $myParameter2)
}
или же
function {
param(
[Parameter(Mandatory=true, Position=0)]$myParameter,
... again $myParameter2)
...
Более простой способ работы с дженериками. Это напрямую не решает подход [Activator], хотя
Function test
{
New-Object "system.collections.generic.list[string]"
}
(test).gettype()