【发布时间】:2016-10-08 01:59:41
【问题描述】:
在 Powershell 中有许多不同的方法来创建对象。我将其发布为纯粹在 Powerhell 中创建对象的挑战。我正在寻找一种使用满足这些要求的 Add-Type 创建对象的方法:
- 强类型对象属性
- 已实例化,使用:
New-Object、[My.Object]::New()、[My.Object]@{'Property'='Value'} - 自定义命名空间的一部分(即 [My.Object])
- 可以进行类型检查。示例:
$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
话虽如此,是否有其他(可能更好)方法来创建外观、感觉和行为类似于原生 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."
没有命名空间的对象:
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")
【问题讨论】:
-
我喜欢你的意思。我认为您所要求的在纯 PowerShell 中是不可能的。这是我所知道的最好的:powershellstation.com/2016/05/22/custom-objects-and-pstypename
-
我在上面发布的示例几乎涵盖了所有规则。但我确信仍然需要做一些事情才能使它像一个原生的 Powershell 对象。啊,是的,您的 PSTypeName 链接很好,它添加了一个类型名称,因此您可以对它们使用 format.ps1xml 格式。我会将它添加到上面的示例中。
标签: c# powershell powershell-3.0 powershell-4.0 powershell-5.0