Строго набирайте свойства пользовательского объекта PS - PullRequest
0 голосов
/ 11 июня 2019

Я использовал хеш-таблицы для возврата сложных данных из функций, и это работало хорошо, но я хотел бы иметь строго типизированные ключи, поскольку у меня есть логические значения, строки, массивы строк, упорядоченные словари и тому подобное ввозвращенные хеш-таблицы.Итак, учитывая что-то вроде этого

[hashtable]$hashtable = @{
    one = 1
    two = "two"
}

У меня проблема в том, что тип каждой клавиши слабо набран.Я хочу в основном сделать это

[hashtable]$hashtable = @{
    [int]one = 1
    [string]two = "two"
}

Но это не правильный код.Поэтому я подумал, что смогу сделать это

[psCustomObject]$object = [psCustomObject]@{
    [int]one = 1
    [string]two = "two"
}

Но это тоже недействительно.Я нахожу это немного уродливым, и оно также не работает

$object = New-Object -typeName:PSObject
$object | Add-Member -memberType:int -name:'one' -value:1
$object | Add-Member -memberType:string -name:'two' -value:'two'

Итак, я SOL, и нет способа или нет элегантного способа создать пользовательский объект со строго типизированными свойствами?

1 Ответ

0 голосов
/ 11 июня 2019

Внутри литерала хеш-таблицы вы захотите ввести выражение значения *1001* вместо:

PS C:\> $object = [PSCustomObject]@{
    one = [int]1
    two = [string]"two"
}
PS C:\> $object|gm -MemberType NoteProperty

   TypeName: System.Management.Automation.PSCustomObject

Name MemberType   Definition
---- ----------   ----------
one  NoteProperty int one=1
two  NoteProperty string two=two

Это, однако, не помешает никому хранить нецелое илинестроковое в любом из свойств - свойство psobject просто не является строго типизированным.


Если вам нужна безопасность типов для свойств, вам нужно создать новый тип с classключевое слово :

class MyOneTwo
{
    [int]$One
    [string]$Two

    MyOneTwo(){}

    MyOneTwo([int]$one, [string]$two){
        $this.One = $one
        $this.Two = $two
    }
}

# Create instances with ::new(), New-Object or a cast:
$object = [MyOneTwo]::new(1,"2")
$object = New-Object MyOneTwo -Property @{ One = 1; Two = "2" }
$object = [MyOneTwo]@{ One = 1; Two = "2" }
...