可能这个问题之前已经得到了回答......但我还没有找到满足我需求的具体答案。
BTW我正在使用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();
封装行为,这意味着在我的对象中创建函数,然后将它们标记为私有
[很高兴]。创建基类,以便我可以继承并专门化我的行为重写方法
[很高兴]。创建界面,这样我就可以开始考虑单独测试我的PowerShell方法了(我知道有像Pester这样的工具来做这个我只是专注在OOP功能上)
到目前为止,我所做的是仅创建具有属性的对象(DTO),但我想向我的对象添加行为
如果你们指出我正确的方向,我会很感激
答案 0 :(得分:12)
使用方法创建对象的两个选项:
代码示例:
$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!'
}
}
编辑:谈到私人/公共......在后一个示例中,属性不会“默认”出现。您可以使用Export-ModuleMember
来决定公开内容,并指定将公开的-Variable
(属性)和/或-Function
(方法)。没有显式Export-ModuleMember
,它的行为与“普通”模块中的相同 - 仅导出函数(方法)。
答案 1 :(得分:5)
如果您想要完整 OOP(包括继承,但不是接口),那么PSClass是MS-PL许可的实现。
答案 2 :(得分:4)
PowerShell v5引入了全班支持,可以轻松地使用属性和实现方法构建自己的类。
查看Trevor关于此主题的精彩博文。 Trevor Sullivan, Implementing a .net Class