今天我遇到了一些旧代码,这激起了我的好奇心。 我知道在 PowerShell 4.0 中实例化 .NET 对象有 2 种不同的语法方式
# Using New-Object to pass multiple args to the constructor
$ex = New-Object -TypeName System.IO.FileNotFoundException -ArgumentList 'No File Found!', 'C:\NoFile.txt'
# Alternate Syntax - how can you pass multiple args?
$ex = [System.IO.FileNotFoundException] 'No File Found!'
在 6.18 .NET Conversion 中,当满足其中一个转换规则时,您可以通过强制转换来创建对象。其中最常见的是:
构造函数:如果目标类型有一个构造函数采用单个参数,且其类型是源类型的类型,则调用该构造函数来执行转换。
class Foo {
[string] $FooProp
Foo([string] $foo) {
$this.FooProp = $foo
}
}
[Foo] 'OK!'
Parse 方法:如果源类型是 string 并且目标类型有一个名为 Parse 的方法,则调用该方法来执行转换。
class Foo {
[string] $FooProp
static [Foo] Parse([string] $foo) {
return [Foo]@{ FooProp = $foo }
}
}
[Foo] 'OK!'
显式转换运算符:如果源类型具有转换为目标类型的显式转换运算符,则调用该运算符来执行转换。如果目标类型具有从源类型进行转换的显式转换运算符,则会调用该运算符来执行转换。
class Foo {
[string] $FooProp
static [Foo] op_Explicit([string] $foo) {
return [Foo]@{ FooProp = $foo }
}
}
[Foo] 'OK!'
你不能。更接近的可能是在 5.1 中,他们将允许您使用哈希表文字进行实例化:
class Foo {
[string] $FooProp
[string] $BarProp
}
[Foo]@{ FooProp = 'OK!'; BarProp = '123' }