Private/Utils/ConvertTo-PSCustomObject.ps1

function ConvertTo-PSCustomObject {
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory = $true, Position=0, ValueFromPipeline = $true)]
        $InputObject,

        [Parameter(Mandatory = $false, Position=1)]
        [switch]$Anonymize
    )

    Begin { }
    Process {
        if ($null -eq $InputObject) {
            return $null
        }

        # Handle primitive types first
        if ($InputObject -is [string] -or $InputObject -is [bool] -or $InputObject -is [int] -or
            $InputObject -is [long] -or $InputObject -is [double] -or $InputObject -is [decimal] -or
            $InputObject -is [DateTime] -or $InputObject -is [ValueType]) {
            return $InputObject
        }
        # Handle arrays
        elseif ($InputObject -is [System.Array] -or
                ($InputObject -is [System.Collections.IEnumerable] -and
                $InputObject -isnot [string] -and
                $InputObject -isnot [System.Collections.IDictionary])) {
            $array = @()
            foreach ($item in $InputObject) {
                $array += $item | ConvertTo-PSCustomObject -Anonymize:$Anonymize
            }
            return $array
        }
        # Handle hashtables - convert to PSCustomObject
        elseif ($InputObject -is [System.Collections.IDictionary]) {
            $properties = @{}
            foreach ($key in $InputObject.Keys) {
                $properties[$key] = $InputObject[$key] | ConvertTo-PSCustomObject -Anonymize:$Anonymize
            }
            return [PSCustomObject]$properties
        }
        # Handle PSCustomObjects - process recursively
        elseif ($InputObject -is [PSCustomObject]) {
            $properties = @{}
            foreach ($property in $InputObject.PSObject.Properties) {
                $properties[$property.Name] = $property.Value | ConvertTo-PSCustomObject -Anonymize:$Anonymize
            }
            return [PSCustomObject]$properties
        }
        else {
            return $InputObject
        }
    }
}