functions/Show-HiddenMember.ps1

function Show-HiddenMember {
    [cmdletbinding()]
    [OutputType('psHiddenMember')]
    [Alias('sm')]

    param(
        [Parameter(
            Position = 0,
            Mandatory,
            ValueFromPipeline,
            HelpMessage = 'Pipe an object to this command'
        )]
        [Object]$InputObject,
        [System.Management.Automation.PSMemberTypes]$MemberType = 'All',
        [Parameter(HelpMessage = 'Exclude methods like get_Name and set_Name')]
        [Switch]$ExcludePropertyMethod
    )
    begin {
        #tags are used for categorizing the command
        #cmdTags = scripting

        $count = 0
    } #begin
    process {
        #assume all piped objects are the same type so only need to process the first one.
        $count++
        if ($count -le 1) {

            $normal = $InputObject | Get-Member -MemberType $MemberType
            $all = $InputObject | Get-Member -MemberType $MemberType -Force

            Write-Information $normal -Tags data
            Write-Information $all -Tags data

            #it is possible the object won't have the specified type
            if ($all -and $normal) {
                $diff = Compare-Object -ReferenceObject $normal -DifferenceObject $all -Property Name, MemberType |
                Select-Object Name, MemberType, @{Name = 'Type'; Expression = { $InputObject.GetType().FullName } } |
                ForEach-Object {
                    #insert a custom type name
                    $_.PSObject.TypeNames.Insert(0, 'psHiddenMember')
                    $_
                }
            }
            elseif ((-not $normal) -and $all) {
                $diff = $all | Select-Object Name, MemberType, @{Name = 'Type'; Expression = { $InputObject.GetType().FullName } } |
                ForEach-Object {
                    #insert a custom type name
                    $_.PSObject.TypeNames.Insert(0, 'psHiddenMember')
                    $_
                }
            }

            if ($diff) {
                Write-Information $diff -Tags data
                if ($ExcludePropertyMethod) {
                    $diff.where({ $_.Name -notmatch '\w+_\w+' })
                }
                else {
                    $diff
                }
            }
        } #count <= 1

    } #process
    end {
        #this script block is unused
    }
}

#EOF