我想知道是否有可能在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))