WinForm внутри хеш-таблицы - PullRequest
1 голос
/ 29 января 2020

Я могу установить элементы формы внутри хеш-таблицы:

$Hash = @{}

$Hash.Main = New-Object System.Windows.Forms.Form
$Hash.Main.Left = 0
$Hash.Main.Top = 0
...
$Hash.Label = New-Object System.Windows.Forms.Label
$Hash.Label.Left = 0
$Hash.Label.Top = 0
...
$Hash.Panel = New-Object System.Windows.Forms.Panel
$Hash.Panel.Left = 0
$Hash.Panel.Top = 0
...

Как я могу написать то же самое в хеш-таблице? Я пытался сделать это так, как будто это могло быть. И это работает. Но правильный ли это синтаксис?

$Hash = @{

   Main = [System.Windows.Forms.Form] @{

      Left = 0
      Top = 0
      ...
   }

   Label = [System.Windows.Forms.Label] @{

      Left = 0
      Top = 0
      ...
   }

   Panel = [System.Windows.Forms.Panel] @{

      Left = 0
      Top = 0
      ...
   }
}

Спасибо

1 Ответ

3 голосов
/ 11 февраля 2020

Да, этот синтаксис правильный:

Создание объектов из Ha sh Таблицы

Начиная с PowerShell 3.0, вы можете создавать объекты из хеш-таблица свойств и значений свойств.

Синтаксис выглядит следующим образом:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
  …
}

Этот метод работает только для классов, которые имеют нулевой конструктор , то есть конструктор, который не имеет параметров. Свойства объекта должны быть publi c и settable .

Для получения дополнительной информации см. about_Object_Creation .

Проверьте первое условие (конструктор без параметров):

[System.Drawing.Font],        ### does not have empty constructor 
[System.Windows.Forms.Form],
[System.Windows.Forms.Label],
[System.Windows.Forms.Panel] |
    Where-Object { 
        'new' -in ( $_ | 
            Get-Member -MemberType Methods -Static | 
                Select-Object -ExpandProperty Name ) -and
        $_::new.OverloadDefinitions -match ([regex]::Escape('new()'))
    } | Select-Object -ExpandProperty FullName
System.Windows.Forms.Form
System.Windows.Forms.Label
System.Windows.Forms.Panel

Проверьте последнее условие (свойства объекта должны быть опубликованы c и устанавливается):

[System.Windows.Forms.Form],
[System.Windows.Forms.Label],
[System.Windows.Forms.Panel] | 
    ForEach-Object {
        @{ $_.FullName = ( 
            $_.GetProperties('Instance,Public') | Where-Object CanWrite |
                Select-Object -ExpandProperty Name | Sort-Object
           )
        }
    }
Name                           Value
----                           -----
System.Windows.Forms.Form      {AcceptButton, AccessibleDefaultActionDescription, Acc...
System.Windows.Forms.Label     {AccessibleDefaultActionDescription, AccessibleDescrip...
System.Windows.Forms.Panel     {AccessibleDefaultActionDescription, AccessibleDescrip...

Сборка обоих приведенных выше фрагментов кода - тривиальная задача…

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