我想知道是否有可能在Powershell中使用两个构造函数创建一个类,这两个构造函数都接受相同数量的参数,但是它们的类型不同。例如,我要创建如下内容:

class User {
    [string]$GivenName
    [string]$Surname
    [string]$DisplayName
    [string]$Company
    [string]$PayrollNo
    [string]$Email
    [DateTime]$StartDate
    [DateTime]$LeaveDate

    User([Microsoft.ActiveDirectory.Management.ADAccount]$ADUser) {
        $this.GivenName   = $ADUser.GivenName
        $this.Surname     = $ADUser.Surname
        $this.DisplayName = $ADUser.Name
        $this.PayrollNo   = $ADUser.EmployeeID
        $this.Email       = $ADUser.EmailAddress
    }

    User([System.Array]$TraceUser) {
        $this.GivenName   = $TraceUser.'First Name'
        $this.Surname     = $TraceUser.Surname
        $this.DisplayName = "$($TraceUser.'First Name') $($TraceUser.Surname)"
        $this.Company     = $TraceUser.'Payroll Company'
        $this.PayrollNo   = $TraceUser.'Payroll No'
        $this.Email       = $TraceUser.'E-Mail'
        $this.StartDate   = [datetime]::ParseExact("$($TraceUser.'Start Date') 23:59",'dd/MM/yyyy HH:mm',$null)
        $this.LeaveDate   = [datetime]::ParseExact("$($TraceUser.'Leaving Date') 23:59",'dd/MM/yyyy HH:mm',$null)
    }
}

如果我以AD用户作为参数实例化一个对象,它将使用第一个构造函数,但是如果我使用数组实例化,则将使用第二个构造函数。

这似乎不起作用,通过在线搜索,我所能找到的就是如何使用不同数量的参数来重载。没有关于基于类型的重载。

这可能吗?

编辑:为了提供更多的上下文,下面的ArcSet正确猜测了我的错误。我正在看:
Cannot find an overload for "new" and the argument count: "1".

通过运行Get-ADUser获得传递给第一个构造函数的$ ADUser。传递给第二个构造函数的$ TraceUser来自Import-CSV。

当我实例化User类的对象时,我将使用Get-ADUser中的AD User来调用它,在这种情况下,我要运行第一个构造函数,或者使用System来调用它。来自Import-CSV的数组,在这种情况下,我希望第二个构造函数运行。

我实际上是在ForEach循环中实例化它们,但是我认为这与这里无关。以下是我如何创建这些示例:
$oneADUser      = Get-ADUser -Filter * -SearchBase $OU
$oneTraceUser   = Import-CSV somefile.csv
$NewADUsers     = @()
$NewTraceUsers  = @()
$NewADUsers    += [User]::new($oneADUser)    # This should use the first constructor
$NewTraceUsers += [User]::new($oneTraceUser) # This should use the second constructor

我这样做对吗?

最佳答案

我认为您可能会遇到的错误是



那是因为它将您要传递的数组视为参数数组

New-Object User -ArgumentList (Get-ADUser -Filter * | select -First 3)

这将失败,并显示以下消息



如何解决这个问题,将,放在前面
New-Object User -ArgumentList (,(Get-ADUser -Filter * | select -First 3))

您也可以使用::New()
[User]::new((Get-ADUser -Filter * | select -First 3))

10-07 19:29
查看更多