c# - 如何在 PowerShell 中创建具有行为(方法)的真实对象?

标签 c# powershell powershell-2.0 powershell-3.0

可能这个问题以前有人回答过....但我还没有找到满足我需求的具体答案。

顺便说一句,我正在使用 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) 的对象,但我想为我的对象添加行为

如果你们指出正确的方向,我将不胜感激

最佳答案

使用方法创建对象的两种选择:

  1. 添加成员
  2. 新模块-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/

相关文章:

powershell - 循环访问多个 SharePoint 网站集

powershell - 将 Powershell 输出导出到用户桌面(用户桌面各不相同)

c# - 使用 Powershell 自动禁用 Windows 更新

powershell - 从远程计算机获取Powershell中.dll的文件版本

c# - 具有 lambda 格式的 Visual Studio 自动完成事件处理程序

c# - Web API 中损坏的路由/操作

performance - 在Powershell脚本或命令行中创建和编辑性能计数器

arrays - 空值 powershell 数组

c# - 如何干净地暂停一个线程,直到另一个线程完成或更改一个值

c# - SQLite C# 查询不起作用