В PowerShell v3.0 PSCustomObject
. Это как PSObject
, но лучше. Среди других улучшений (например, порядок свойств сохраняется), создавая объект из хеш-таблицы упрощается:Ускорители типа PowerShell: PSObject vs PSCustomObject
[PSCustomObject]@{one=1; two=2;}
Теперь кажется очевидным, что это утверждение:
[System.Management.Automation.PSCustomObject]@{one=1; two=2;}
будет работать точно так же, потому что PSCustomObject
является «псевдоним» для полного пространства имен + имя класса. Вместо этого я получаю сообщение об ошибке:
Cannot convert the "System.Collections.Hashtable" value of type "System.Collections.Hashtable" to type "System.Management.Automation.PSCustomObject".
Я перечислил акселераторы для обоих типов объектов:
[accelerators]::get.GetEnumerator() | where key -Like ps*object
Key Value
--- -----
psobject System.Management.Automation.PSObject
pscustomobject System.Management.Automation.PSObject
и обнаружили, что оба ссылаются на тот же PSObject
класс - это должно означать, что с помощью ускорителей можно сделать кучу других вещей, чем просто сделать код короче.
Мои вопросы по этому вопросу являются:
- У вас есть некоторые интересные examaples различий между использованием ускорителя против использования полного имени типа?
- Следует избегать использования полного типа, всякий раз, когда ускоритель доступен в качестве общей лучшей практики?
- Как проверить, может быть, использовать отражение, если ускоритель выполняет другие действия, а не просто указывает на базовый класс?
Если вы декомпилируете 'System.Management.Automation.Language.Compiler.VisitConvertExpression', то вы можете увидеть, что есть специальная обработка для трех типов имен: 'ordered',' PSCustomObject' и 'ref'. – PetSerAl