Мне интересно, можно ли создать класс в 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".
$ ADUser, переданный первому конструктору, получается путем запуска Get-ADUser. $ TraceUser, переданный второму конструктору, поступает из Import-CSV.
Когда я создаю экземпляр объекта класса User, я собираюсь вызвать его либо с помощью пользователя AD из Get-ADUser, в в этом случае я хочу, чтобы первый конструктор запускался, или я собираюсь вызвать его с помощью System.Array, полученного из 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
Правильно ли я это делаю?