Private/ConvertToHashtable.ps1

function ConvertToHashtable {
    param(
        [object]
        $InputObject,
        [switch]
        $Ordered
    )
    if ($Ordered.IsPresent) {
        $HashTable = [ordered]@{}
    }
    else {
        $HashTable = @{}
    }
    foreach ($Prop in $InputObject.psobject.Properties) {
        if ($null -eq $Prop.Value) {
            $HashTable.Add($Prop.Name, $Prop.Value)
        }
        elseif ($Prop.TypeNameOfValue -eq 'System.String' -or $Prop.Value.GetType().IsValueType) {
            $HashTable.Add($Prop.Name, $Prop.Value)
        }
        else {
            $Value = ConvertToHashtable -InputObject $Prop.Value -Ordered:$Ordered
            $HashTable.Add($Prop.Name, $Value)
        }
    }
    $HashTable
}