Private/ConvertTo-Hashtable.ps1

function ConvertTo-Hashtable {
    <#
    .SYNOPSIS
        Converts PSObject to Hashtable
    .DESCRIPTION
        Inputs PSObject and converts hashtable by iterating trough properties
    .PARAMETER Object
        PSObject
    .EXAMPLE
        ConvertTo-Hashtable $InputObject.Disk[0]
    #>

    [CmdletBinding()]
    param(
        [PSObject]$Object
    )
    $Hashtable = @{}
    foreach ($Property in ($Object | Get-Member -MemberType *Property -ea Ignore).Name) {
        if ($null -ne $Object.$Property) {
            switch ($Object.$Property.GetType()) {
                { $_.BaseType.Name -eq 'Array' -or $_.FullName -eq 'System.Collections.ArrayList' } {
                    $Arr = @()
                    # SelfInvocation for array
                    foreach ($item in $Object.$Property) {
                        if ($item -is [String] -or $item -is [Hashtable]) {
                            $Arr += $item
                        }
                        elseif ($item -is [System.Enum]) {
                            $Arr += $item | ConvertTo-EnumString
                        }
                        else {
                            $Arr += ConvertTo-Hashtable $item
                        }
                    }
                    $Hashtable.$Property = $Arr
                }
                Default {
                    # SelfInvocation for hashtable
                    if ($Object.$Property | Get-Member -MemberType NoteProperty -ea Ignore) {
                        $Hashtable.$Property = ConvertTo-Hashtable $Object.$Property
                    }
                    else {
                        $Hashtable.$Property = $Object.$Property
                    }
                }
            }
        }
        else {
            $Hashtable.$Property = $null
        }
    }
    return $Hashtable
}