В PowerShell 5 можно ли объявить общие свойства для класса?

В PowerShell версии 5 появилось ключевое слово Class, упрощающее создание настраиваемые классы в PowerShell. Объявление содержит только краткую информацию о свойствах:

Все объекты являются общедоступными. Для свойств требуется перевод строки или точка с запятой. Если тип объекта не указан, типом свойства является объект.

Все идет нормально. Это означает, что я могу легко создать класс, который выглядит так:

Class Node
{
    [String]$Label
    $Nodes
}

Я сталкиваюсь с проблемами в том, что, если не указать тип для $Nodes, по умолчанию используется System.Object. Моя цель - использовать тип System.Collections.Generic.List, но пока не понял, как это сделать.

Class Node
{
    [String]$Label
    [System.Collections.Generic.List<Node>]$Nodes
}

Вышесказанное приводит к целому ряду вопросов:

At D:\Scripts\Test.ps1:4 char:36
+     [System.Collections.Generic.List<Node>]$Nodes
+                                    ~
Missing ] at end of attribute or type literal.
At D:\Scripts\Test.ps1:4 char:37
+     [System.Collections.Generic.List<Node>]$Nodes
+                                     ~
Missing a property name or method definition.
At D:\Scripts\Test.ps1:4 char:5
+     [System.Collections.Generic.List<Node>]$Nodes
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Missing closing '}' in statement block or type definition.
At D:\Scripts\Test.ps1:5 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : EndSquareBracketExpectedAtEndOfAttribute

Это подводит меня к вопросу, как мне использовать универсальный тип для свойства в PowerShell 5?


person ahsteele    schedule 24.10.2016    source источник


Ответы (1)


При разработке своего вопроса я наткнулся на ответ, в котором подробно описано, как создавать Dictionary объекты в PowerShell 2:

$object = New-Object 'system.collections.generic.dictionary[string,int]'

Особо следует отметить отсутствие использования < и > для общего объявления вместо использования [ и ]. Переключение объявления моего класса на использование квадратных скобок вместо угловые скобки решили мою проблему:

Class Node
{
    [String]$Label
    [System.Collections.Generic.List[Node]]$Nodes
}
person ahsteele    schedule 24.10.2016