关于c#:如何在PowerShell中使用行为(方法)创建真实对象?

How to create real objects with behavior (methods) in PowerShell?

可能这个问题之前已经被回答过……但我没有找到一个具体的答案来满足我的需要。

顺便说一句,我正在使用PowerShell3

嗯,我是PowerShell的新手,但作为一名C开发人员,我有很多经验,所以使用对象对我来说非常重要。

因此,我想知道是否有一种干净的方法可以在PowerShell脚本中应用OOP概念(当然不是所有概念,尽管这很好),例如,我想做一些特定的事情。

注意:我知道我可以在PowerShell中编写C代码来创建DTO,也可以在C中创建PowerShell二进制模块,我过去已经这样做过,但现在我要寻找的是能够在PowerShell中以面向对象的方式编写所有代码。

我想做的事情:

  • 在PowerShell中创建对象,并公开用PowerShell编写的函数,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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),但我想将行为添加到我的对象中。

如果你们能给我指明正确的方向,我将不胜感激。


使用方法创建对象的两个选项:

  • 添加成员
  • 新建模块-AsCustomObject
  • 代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $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,它的行为将与"普通"模块中的相同——仅导出函数(方法)。


    如果您想要完整的OOP(包括继承,尽管不是接口),那么psclass是一个MS-PL许可的实现。


    PowerShellv5引入了完整的类支持,使得使用属性和实现方法构建自己的类变得容易。

    看看特雷弗关于这个话题的博客文章。Trevor Sullivan,实现.NET类