functions/object-properties.ps1
function get-propertynames($obj) { Measure-function "$($MyInvocation.MyCommand.Name)" { if ($obj -is [System.Collections.IDictionary]) { return $obj.keys } return $obj.psobject.Properties | select -ExpandProperty name } } function add-properties( [Parameter(Mandatory=$true, ValueFromPipeline = $true)] $object, [Parameter(Mandatory=$true)] $props, [switch][bool] $ifNotExists, [switch][bool] $merge, $exclude = @() ) { Measure-function "$($MyInvocation.MyCommand.Name)" { foreach($prop in get-propertynames $props) { if ($prop -notin $exclude) { try { $r = add-property $object -name $prop -value $props.$prop -ifnotexists:$ifnotexists -merge:$merge } catch { throw "failed to add property '$prop' with value '$props.$prop': $($_.Exception.Message)" } } } return $object } } function add-property { [CmdletBinding()] param( [Parameter(ValueFromPipeline = $true, Position=1)] $object, [Parameter(Mandatory=$true,Position=2)] $name, [Parameter(Mandatory=$true,Position=3)] $value, [switch][bool] $ifNotExists, [switch][bool] $overwrite, [switch][bool] $merge ) # Measure-function "$($MyInvocation.MyCommand.Name)" { try { if ($null -ne $object.$name) { if ($merge -and $object.$name -is [System.Collections.IDictionary] -and $value -is [System.Collections.IDictionary]) { $r = add-properties $object.$name $value -ifNotExists:$ifNotExists -merge:$merge return $object } elseif ($ifNotExists) { return } elseif ($overwrite) { $object.$name = $value } else { throw "property '$name' already exists with value '$($obj.$name)'" } } if ($object -is [System.Collections.IDictionary]) { $object[$name] = $value } else { throw "optimization - only support hashtabes" $null = $object | add-member -name $name -membertype noteproperty -value $value #$object.$name = $value } return $object } catch { throw } # } } function ConvertTo-Hashtable([Parameter(ValueFromPipeline=$true)]$obj, [switch][bool]$recurse) { Measure-function "$($MyInvocation.MyCommand.Name)" { $object =$obj if (!$recurse -and ($object -is [System.Collections.IDictionary] -or $object -is [array])) { return $object } if($object -is [array]) { if ($recurse) { for($i = 0; $i -lt $object.Length; $i++) { $object[$i] = ConvertTo-Hashtable $object[$i] -recurse:$recurse } } return $object } elseif ($object -is [System.Collections.IDictionary] -or $object -is [System.Management.Automation.PSCustomObject] -or $true) { $h = @{} $props = get-propertynames $object foreach ($p in $props) { if ($recurse) { $h[$p] = ConvertTo-Hashtable $object.$p -recurse:$recurse } else { $h[$p] = $object.$p } } return $h } else { throw "could not convert object to hashtable" #return $object } } } function ConvertTo-Object([Parameter(ValueFromPipeline=$true)]$hashtable, $recurse) { Measure-function "$($MyInvocation.MyCommand.Name)" { if ($hashtable -is [hashtable]) { $copy = @{} $copy += $hashtable foreach($key in = get-propertynames $hashtable) { $val = $hashtable[$key] $obj = ConvertTo-Object $val -recurse $recurse $copy[$key] = $obj } return New-Object -TypeName PSCustomObject -Property $copy } elseif ($hashtable -is [System.Management.Automation.PSCustomObject]) { $copy = @{} foreach($key in get-propertynames $hashtable) { $val = $hashtable.$key $obj = ConvertTo-Object $val -recurse $recurse $copy[$key] = $obj } return New-Object -TypeName PSCustomObject -Property $copy } elseif ($hashtable -is [Array]) { return $hashtable } else { return $hashtable } } } function copy-hashtable($hash) { Measure-function "$($MyInvocation.MyCommand.Name)" { $new = @{} foreach($key in get-propertynames $hash) { if ($hash.$key -is [System.Collections.IDictionary]) { $new.$key = copy-hashtable $hash.$key } else { $new.$key = $hash.$key } } return $new } } |