Как установить вывод по умолчанию для класса PowerShell - PullRequest
2 голосов
/ 02 марта 2020

Я пытаюсь создать класс PowerShell [DataTable], производный от стандартного класса [Data.DataTable], чтобы упростить создание таблиц данных:
(см. Также: #11987 Ускорено [DataTable]) с помощью простого конструктора и метода AddRow )

class DataTable : Data.DataTable {
    [ValidateNotNullOrEmpty()][Data.DataTable]$DataTable
    DataTable([Array]$ColumnNames) {
        $This.DataTable = New-Object Data.DataTable
        ForEach ($ColumnName in $ColumnNames) {
            If ($ColumnName -is [System.Collections.IDictionary]) {
                ForEach($Key in $ColumnName.Get_keys()) { $This.AddColumn($Key, $ColumnName[$Key]) }
            } Else { $This.AddColumn($ColumnName) }
        }
    }
    [Void]AddColumn([String]$ColumnName) {
        $DataColumn = New-Object Data.DataColumn($ColumnName)
        $This.DataTable.Columns.Add($DataColumn)
    }
    [Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
        $DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
        $This.DataTable.Columns.Add($DataColumn)
    }
    [Void]AddRow([Array]$Array) {
        $DataRow = $This.DataTable.NewRow()
        For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
        $This.DataTable.Rows.Add($DataRow)
    }
    [Void]AddRow([System.Collections.IDictionary]$Dictionary) {
        $DataRow = $This.DataTable.NewRow()
        ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
        $This.DataTable.Rows.Add($DataRow)
    }
}

Работает для создания новой таблицы данных:

$MyDataTable = [DataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))

Но для получения $DataTable нужно сделать :

$MyDataTable.DataTable
a b c
- - -
1 2 3

Я хочу, чтобы она выводила таблицу данных по умолчанию $MyDataTable.DataTable и выполняла такие действия:

$MyDataTable | ForEach-Object { ...

Как я могу разрешить моему классу возврат $This.DataTable по умолчанию?
(или это просто невозможно с классом PowerShell?)


Обновление
Были некоторые ( не связанные с вопросом) ошибки в классе, которые я исправил ниже вместе с ответом от @ Adam Luniewski .

class DataTable : Data.DataTable {

    DataTable([Array]$ColumnNames) {
        ForEach ($ColumnName in $ColumnNames) { $This.AddColumn($ColumnName) }
    }
    DataTable([System.Collections.IDictionary]$ColumnNameTypes) {
        ForEach($Key in $ColumnNameTypes.Get_keys()) { $This.AddColumn($Key, $ColumnNameTypes[$Key]) }
    }
    [Void]AddColumn([String]$ColumnName) {
        $DataColumn = New-Object Data.DataColumn($ColumnName)
        $This.Columns.Add($DataColumn)
    }
    [Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
        $DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
        $This.Columns.Add($DataColumn)
    }
    [Void]AddRow([Array]$Array) {
        $DataRow = $This.NewRow()
        For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
        $This.Rows.Add($DataRow)
    }
    [Void]AddRow([System.Collections.IDictionary]$Dictionary) {
        $DataRow = $This.NewRow()
        ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
        $This.Rows.Add($DataRow)
    }
}

1 Ответ

3 голосов
/ 02 марта 2020

Ваш новый класс расширяет DataTable, поэтому он уже является DataTable. Вам не нужен внутренний DataTable, и вы можете выполнять все операции с $ This вместо $ This.DataTable. Я только изменил имя класса на MyDataTable и удалил внутренний DataTable:

class MyDataTable : Data.DataTable {

  MyDataTable([Array]$ColumnNames) {
      ForEach ($ColumnName in $ColumnNames) {
          If ($ColumnName -is [System.Collections.IDictionary]) {
              ForEach($Key in $ColumnName.Get_keys()) { $This.AddColumn($Key, $ColumnName[$Key]) }
          } Else { $This.AddColumn($ColumnName) }
      }
  }
  [Void]AddColumn([String]$ColumnName) {
      $DataColumn = New-Object Data.DataColumn($ColumnName)
      $This.Columns.Add($DataColumn)
  }
  [Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
      $DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
      $This.Columns.Add($DataColumn)
  }
  [Void]AddRow([Array]$Array) {
      $DataRow = $This.NewRow()
      For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
      $This.Rows.Add($DataRow)
  }
  [Void]AddRow([System.Collections.IDictionary]$Dictionary) {
      $DataRow = $This.NewRow()
      ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
      $This.Rows.Add($DataRow)
  }
}

$MyDataTable = [MyDataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))

$MyDataTable #works now:


a b c
- - -
1 2 3
...