Create dynamic custom objects
(To define an actual class see How to make a custom class)
Say you have two variables, $name and $count -- and you want to create a custom object that contains just those two properies....
$myObject = New-Object psobject -property  @{name = $name; count = $count}
Or say you are in a pipeline, within which $name and $count become available... you want to pipe out a custom object with those two properties...
dir *.xml | % {
	$name = $_.FullPath
	$count = $_.Length
	# ^^ just for example
	New-Object psobject -property  @{name = $name; count = $count}
	# ^^ Return our custom object... for the next actor in the pipeline to deal with...
} | ConvertTo-CSV  -NoTypeInformation | out-file "Name_And_Count.csv"
Similar: PSCustomObject
[PSCustomObject]@{
	Name = $_.FullPath
	Count = $_.Length
}
This is newer. It's slightly less typing. It can have other improvements.
What's the difference?
both avenues will output the data as NoteProperties in the System.Management.Automation.PSCustomObject object types
—source