Powershell构造函数中是否按类型重载?
我想知道是否有可能在Powershell中创建一个包含两个构造函数的类,这两个构造函数都接受相同数量的参数,但它们的类型不同。例如,我想创建如下内容:Powershell构造函数中是否按类型重载?,powershell,class,types,constructor,overloading,Powershell,Class,Types,Constructor,Overloading,我想知道是否有可能在Powershell中创建一个包含两个构造函数的类,这两个构造函数都接受相同数量的参数,但它们的类型不同。例如,我想创建如下内容: 类用户{ [字符串]$GivenName [字符串]$姓氏 [字符串]$DisplayName [字符串]$公司 [字符串]$PayrollNo [字符串]$Email [日期时间]$StartDate [DateTime]$LeaveDate 用户([Microsoft.ActiveDirectory.Management.ADAccount]
类用户{
[字符串]$GivenName
[字符串]$姓氏
[字符串]$DisplayName
[字符串]$公司
[字符串]$PayrollNo
[字符串]$Email
[日期时间]$StartDate
[DateTime]$LeaveDate
用户([Microsoft.ActiveDirectory.Management.ADAccount]$ADUser){
$this.GivenName=$ADUser.GivenName
$this.lasname=$ADUser.lasname
$this.DisplayName=$ADUser.Name
$this.PayrollNo=$ADUser.EmployeeID
$this.Email=$ADUser.EmailAddress
}
用户([System.Array]$TraceUser){
$this.GivenName=$TraceUser'First Name'
$this.lasname=$TraceUser.lasname
$this.DisplayName=“$($TraceUser.First Name')$($TraceUser.nam姓氏)”
$this.Company=$TraceUser'Payroll Company'
$this.PayrollNo=$TraceUser'PayrollNo'
$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/yyyyy HH:MM',$null)
}
}
其中,如果我用AD用户作为参数实例化一个对象,它将使用第一个构造函数,但如果我用数组实例化,它将使用第二个构造函数
这似乎不起作用,通过在线搜索我所能找到的就是如何使用不同数量的参数来过载。与基于类型的重载无关
这可能吗
编辑:为了提供更多的上下文,下面正确地猜测了我的错误。我看到:
Cannot find an overload for "new" and the argument count: "1".
传递给第一个构造函数的$ADUser是通过运行Get ADUser获得的。传递给第二个构造函数的$TraceUser来自导入CSV
当我实例化User类的对象时,我将使用Get ADUser中的AD用户调用它,在这种情况下,我希望运行第一个构造函数,或者使用Import CSV中的System.Array调用它,在这种情况下,我希望运行第二个构造函数
我实际上是在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()
好吧,我知道了。谢谢大家的帮助 为了使其正常工作,我必须在将$oneTraceUser传递给构造函数之前将其强制转换为System.Array。最终工作代码如下所示:
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
#$this.LeaveDate = $ADUser.AccountExpires
}
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)
}
}
$NewADUsers = New-Object -TypeName "System.Collections.ArrayList"
$NewTraceUsers = New-Object -TypeName "System.Collections.ArrayList"
$TraceData = Import-CSV $TraceCSV
$ADUsers = Get-ADUser -Filter * -SearchBase $OU -Properties EmployeeID
$TraceUsers = $TraceData | Where-Object 'Payroll Company' -eq $OU.DestinationIndicator
forEach($oneADUser in $ADUsers) {
$NewADUser = [User]::new($oneADUser)
forEach($oneTraceUser in $TraceUsers) {
$NewTraceUser = [User]::new([System.Array]$oneTraceUser)
$Result = Compare-Users $NewADUser $NewTraceUser
Write-Output $Result
}
}
我现在有一个用户类,根据传递给它的变量类型,它将运行从AD或CSV文件导入数据的两个类似构造函数中的一个,并且可以继续使用该类在一般用户之间进行比较。它应该可以工作(尽管
System.Array
可能不是参数类型的最佳选择,但您使用它的方式不同):)请提供更多有关它如何工作的信息-构造函数是否引发异常?它总是选择一个而不是另一个吗?因此,经过进一步的研究,我发现为了使它起作用,构造函数(以及传递给它们的值)需要是强类型的。我现在已经将第二个构造函数更改为[PSCustomObject]$TraceUser,它现在可以工作了。我没有得到任何错误,但你瞧,现在它每次都被使用!我的广告构造器从未被使用过,即使我将ADAccount传递给它。谢谢你的回复!我在原来的帖子中添加了更多的细节。我是否应该以某种方式修改我的实例化,以允许将字符串数组传递给第二个构造函数?
New-Object User -ArgumentList (,(Get-ADUser -Filter * | select -First 3))
[User]::new((Get-ADUser -Filter * | select -First 3))
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
#$this.LeaveDate = $ADUser.AccountExpires
}
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)
}
}
$NewADUsers = New-Object -TypeName "System.Collections.ArrayList"
$NewTraceUsers = New-Object -TypeName "System.Collections.ArrayList"
$TraceData = Import-CSV $TraceCSV
$ADUsers = Get-ADUser -Filter * -SearchBase $OU -Properties EmployeeID
$TraceUsers = $TraceData | Where-Object 'Payroll Company' -eq $OU.DestinationIndicator
forEach($oneADUser in $ADUsers) {
$NewADUser = [User]::new($oneADUser)
forEach($oneTraceUser in $TraceUsers) {
$NewTraceUser = [User]::new([System.Array]$oneTraceUser)
$Result = Compare-Users $NewADUser $NewTraceUser
Write-Output $Result
}
}