定义自定义Powershell对象

B_D*_*b42 5 c# powershell powershell-3.0 powershell-4.0 powershell-5.0

在Powershell中有许多不同的方法来创建对象.我发布这个作为纯粹在Powerhell中创建对象的挑战.我正在寻找一种使用Add-Type创建对象的方法来传递这些要求:

  1. 强类型对象属性
  2. 实例化,使用:New-Object,[My.Object]::New(),[My.Object]@{'Property'='Value'}
  3. 自定义命名空间的一部分(即[My.Object])
  4. 可以进行型式检查.例:$myVar -is [My.Object]

我知道可以在Visual Studio中创建可以实现此目的的dll,但我正在寻找一种纯粹的Powershell方法来创建对象.

以下是我最接近上述规则的示例:

PS C:\> $memberDef = @"
public String myString { get; set; }
public int myInt { get; set; }
"@

PS C:\> Add-Type -Namespace "My.Namespace" -Name "Object" -MemberDefinition $memberDef

PS C:\> $myObj = [My.Namespace.Object]@{'myString'='Foo'; 'myInt'=42}
PS C:\> $myObj

myString myInt
-------- -----
Foo         42
Run Code Online (Sandbox Code Playgroud)

话虽如此,还有其他(可能更好)的方法来创建外观,感觉和行为像本机Powershell对象的对象?

不满足所有规则的示例

弱类型对象属性:

PS C:\> $myObj = "" | Select-Object -Property myString, myInt

PS C:\> $myObj = New-Object -TypeName PSObject -Property @{'myString'='foo'; 'myInt'=42}


PS C:\> $myObj = @{}; $myObj.myString = 'foo'; $myObj.myInt = 42

PS C:\> $myObj.myInt = "This should result in an error."
Run Code Online (Sandbox Code Playgroud)

没有命名空间的对象:

PS C:\> $typeDef = @"
public class myObject {
   public string myString { get; set; }
   public int myInt { get; set; }
}
"@
PS C:\> Add-Type -TypeDefinition $typeDef
PS C:\> $myObj = [myObject]::new()

PS C:\> $myObj = New-Object -TypeName PSObject -Property @{'myString'='foo'; 'myInt'=42}
PS C:\> $myObj.PSObject.TypeNames.Insert(0, "myObject")
Run Code Online (Sandbox Code Playgroud)

B_D*_*b42 0

这是我发现在 Powershell 中创建对象的最佳方法,该对象是命名空间的一部分并涵盖上述所有规则。

PS C:\> $memberDef = @"
public String myString { get; set; }
public int myInt { get; set; }
"@

PS C:\> Add-Type -Namespace "My.Namespace" -Name "Object" -MemberDefinition $memberDef

PS C:\> $myObj = [My.Namespace.Object]@{'myString'='Foo'; 'myInt'=42}
PS C:\> $myObj

myString myInt
-------- -----
Foo         42
Run Code Online (Sandbox Code Playgroud)