#PSTip Overriding the ToString() Method
Note: This tip requires PowerShell 2.0 or above.
In this very helpful tip, Bartek shown us how to create a custom object using the New-Module cmdlet and how to constrain the data the object can hold. Bartek ‘s object represents a user, and almost every time I consume a “user” object the information I care about the most is the user’s full name. So I was wondering what would be the most convenient way to get such information and I realized I want to be able to do “$User is now logged on.” and get “John Doe is now logged on.”, but I’ve tried it and got “@{BirthDate=12/17/1978 00:00:00; FirstName=John; LastName=Doe} is now logged on.”.
So I experimented with it and it turns out all I had to do is define (and export) a ToString function which will output the correct data when the variable will be embedded inside a string.
function New-User {
param (
[String]$FirstName,
[String]$LastName,
[DateTime]$BirthDate
)
New-Module {
param ( $fn, $ln, $bd )
[String]$FirstName = $fn
[String]$LastName = $ln
[DateTime]$BirthDate = $bd
function ToString {"$FirstName $LastName" }
Export-ModuleMember -Variable FirstName, LastName, BirthDate -Function ToString
} -AsCustomObject -ArgumentList $FirstName,$LastName,$BirthDate
}
#Create a new user...
PS> $User = New-User -FirstName John -LastName Doe -BirthDate 12/17/1978
#...and use it:
PS> "$User is now logged on."
John Doe is now logged on.
#Not surprisingly it works with other ways of converting to String too:
PS> $User.ToString() + " is the best!"
John Doe is the best!
PS> [string]$User
John Doe
Share on: