Что такое объект List`1? - PullRequest
       1

Что такое объект List`1?

0 голосов
/ 02 марта 2019

System.IO.FileInfo имеет целевой элемент.

Использование Get-Item -Path * -Include 't.txt' | Get-Member показывает, что он имеет Target член, который является CodeProperty.

Использование GetType()показывает, что это List`1

C:>Get-Item -Path * -Include 't.txt' | ForEach-Object { $_.Target.GetType() }

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     List`1                                   System.Object

C:>Get-Item -Path * -Include 't.txt' | % { $_.Target.GetType() | % { $_.FullName } }
System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

1 Ответ

0 голосов
/ 02 марта 2019

vonPryz предоставил критический указатель в комментарии: List`1 - это .NET представление универсального типа с именем List с арностью (`)1, то есть универсальный тип с параметром 1 типа .

(Использование ` в этом контексте не связано с использованием в PowerShell ` в качестве escape-символа).

В вашем случае System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] означает, что универсальный тип был закрыт (экземпляр) с типом System.String.

Если оставить квалификацию сборки в стороне (mscorlib, Version = ...), эквивалентное представление PowerShell равно System.Collections.Generic.List`1[[string]], который можно упростить двумя способами, однако:

  • Индикатор арности `1 можно опустить, учитывая, что арность подразумевается аргументом типа в [...],[string].
  • Учитывая, что есть только параметр типа 1 , вы можете опустить внешний [...] вокруг списка аргументов типа.

Следовательно, выможно использовать только System.Collections.Generic.List[string] или, выраженное как литерал типа PowerShell ([...]), [System.Collections.Generic.List[string]]


Необязательное чтение: сокращение имен и литералов типовв PowerShell:

[System.Collections.Generic.List[string]] немного громоздко, и его можно сократить двумя способами:

  • PowerShell позволяет пропустить часть System. пространства имен для любого типа , поэтому [Collections.Generic.List[string]] тоже работает.

  • PowerShell v5 + предлагает оператор using namespace , аналогичный оператору C # using:

    # Note:
    #  * `using namespace` must be at the *start* of the script (potentially
    #    preceded by other `using` statements and comments only)
    #  * The 'System.' part of a namespace must *not* be omitted.
    using namespace System.Collections.Generic
    
    [List[string]] # short for: [System.Collections.Generic.List[string]]
    

Кроме того, PowerShell имеет встроенныйв ускорителях типов для некоторых часто используемых типов, которые являются однокомпонентными именами, которые ссылаются на конкретные типы без необходимости указывать их пространство имен происхождения;Например, [xml] - это ускоритель типов для [System.Xml.XmlDocument].

В этом блоге TechNet показано, что вы можете использовать следующую команду для вывода списка всех встроенных ускорителей типов :

[psobject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::
  get.GetEnumerator() | Sort-Object Key

Как указывает TheIncorrigible1 , вы даже можете определять собственные ускорители типов с помощью метода ::Add() ;Например, следующая команда определяет [cmdinfo] как ускоритель для типа [System.Management.Automation.CommandInfo]:

[psobject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::
      Add('cmdinfo', [System.Management.Automation.CommandInfo])

Новый ускоритель будет доступен для сеанса глобально (но только для текущего сеанса), даже если вызовсделано из детской области.

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