可能这个问题以前有人回答过....但我还没有找到满足我需求的具体答案。
顺便说一句,我正在使用 PowerShell 3
嗯,我是 PowerShell 的新手,但作为 C# 开发人员我有很多经验,所以使用对象对我来说非常重要。
所以我想知道是否有一种干净的方式在 PowerShell 脚本中应用 OOP 概念(当然不是全部,尽管那会很棒),因为例如,我想做一些具体的事情。
注意:我知道我可以在 PowerShell 中编写 C# 代码来创建 DTO,而且我可以在 C# 中创建 PowerShell 二进制模块,我过去曾这样做过,但我正在寻找的是现在能够在 PowerShell 中以面向对象的方式编写我的所有代码。
我想做的事情:
在 PowerShell 中创建一个对象,并公开一个用 PowerShell 编写的函数,如下所示:
function New-Person ( [Parameter()][string]$firstName ) { function Walk() { Write-Host "Walking..."; } $person = New-Object psobject; $person | Add-Member -MemberType NoteProperty -Name FirstName -Value $firstName; #This line does not work #$person | Add-Member -MemberType CodeMethod -Name Walk -Value Walk; return $person; } $MyPerson = New-Person -firstName "JP"; $MyPerson; #This line does not work $MyPerson.Walk();
封装行为,这意味着在我的对象中创建函数,然后将它们标记为私有(private)
[很高兴拥有]。创建基类,以便我可以继承和专门化我的行为覆盖方法
[Nice to have]。 创建接口(interface),这样我就可以开始单独考虑我的 PowerShell 方法的单元测试(我知道有像 Pester 这样的工具可以做到这一点,我只是专注于OOP 特性)
到目前为止,我所做的是创建仅具有属性 (DTO) 的对象,但我想为我的对象添加行为
如果你们指出正确的方向,我将不胜感激
最佳答案
使用方法创建对象的两种选择:
- 添加成员
- 新模块-AsCustomObject
代码示例:
$person | Add-Member -MemberType ScriptMethod -Value {
'I do stuff!'
}
$person = New-Module -AsCustomObject -ScriptBlock {
$Property = 'value'
[string]$Other = 'Can be strongly typed'
function MyMethod {
'I do stuff!'
}
}
编辑:谈到私有(private)/公共(public)...在后一个示例中,属性不会“默认”显示。您可以使用 Export-ModuleMember
决定什么是公开的,并指定将公开的 -Variable
(属性)和/或 -Function
(方法) .如果没有显式的 Export-ModuleMember
,它的行为将与“普通”模块中的行为相同 - 仅导出函数(方法)。
关于c# - 如何在 PowerShell 中创建具有行为(方法)的真实对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835983/