簡體   English   中英

將有序哈希表傳遞給函數

[英]Passing an ordered hashtable to a function

如何將有序哈希表傳遞給函數?

以下引發錯誤:

可以僅在散列文字節點上指定ordered屬性。

function doStuff {
    Param (
        [ordered]$theOrderedHashtable
    )
    $theOrderedHashtable
}

$datFileWithMinSizes  = [ordered]@{"FileA.DAT" = "4"; "FileB.DAT" = "5"; "FileC.DAT" = "91" ; "FileD.DAT" = "847"  }

doStuff -theOrderedHashtable $datFileWithMinSizes

以下內容未保持正確的順序:

function doStuff {
    Param (
        [Hashtable]$theOrderedHashtable = [ordered]@{}
    )
    $theOrderedHashtable
}

$datFileWithMinSizes  = [ordered]@{"FileA.DAT" = "4"; "FileB.DAT" = "5"; "FileC.DAT" = "91" ; "FileD.DAT" = "847"  }

doStuff -theOrderedHashtable $datFileWithMinSizes

我目前能夠使用它的唯一方法是不指定類型如下,但我想指定類型:

function doStuff {
    Param (
        $theOrderedHashtable
    )
    $theOrderedHashtable
}

$datFileWithMinSizes  = [ordered]@{"FileA.DAT" = "4"; "FileB.DAT" = "5"; "FileC.DAT" = "91" ; "FileD.DAT" = "847"  }

doStuff -theOrderedHashtable $datFileWithMinSizes

Mathias是對的,但我想指出有一種方法可以在不使用參數集的情況下接受這兩種類型。

這兩種類型都實現了IDictionary接口,因此您可以使用接口強類型化參數,然后接受實現接口的任何類型(包括您創建或不知道的自定義類型):

function Do-Stuff {
    [CmdletBinding(DefaultParameterSetName='Ordered')]
    param(
        [Parameter(Mandatory=$true,Position=0,ParameterSetName='Ordered')]
        [System.Collections.IDictionary]$Dictionary
    )
    $Dictionary.GetType().FullName
}

這將同時接受:

 C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0> do-stuff @{} System.Collections.Hashtable C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0> do-stuff ([ordered]@{}) System.Collections.Specialized.OrderedDictionary 

類似地,如果您只想接受有序字典(但不僅僅是特定的OrderedDictionary類型),您可以使用IOrderedDictionary接口,該接口由上述類型實現,但不能由[hashtable]

function Do-Stuff {
    [CmdletBinding(DefaultParameterSetName='Ordered')]
    param(
        [Parameter(Mandatory=$true,Position=0,ParameterSetName='Ordered')]
        [System.Collections.Specialized.IOrderedDictionary]$Dictionary

    )

    $Dictionary.GetType().FullName
}

然后:

 C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0> do-stuff ([ordered]@{}) System.Collections.Specialized.OrderedDictionary C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0> do-stuff @{} Do-Stuff : Cannot process argument transformation on parameter 'Dictionary'. Cannot convert the "System.Collections.Hashtable" value of type "System.Collections.Hashtable" to type "System.Collections.Specialized.IOrderedDictionary". At line:1 char:10 + do-stuff @{} + ~~~ + CategoryInfo : InvalidData: (:) [Do-Stuff], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,Do-Stuff 

使用完整類型名稱:

function Do-Stuff {
    param(
        [System.Collections.Specialized.OrderedDictionary]$OrderedHashtable
    )
    $OrderedHashtable
}

要支持常規哈希表和有序詞典, 您必須使用單獨的參數集: 使用[System.Collections.IDictionary]接口,如briantist所示

function Do-Stuff {
    [CmdletBinding(DefaultParameterSetName='Ordered')]
    param(
        [Parameter(Mandatory=$true,Position=0,ParameterSetName='Ordered')]
        [System.Collections.Specialized.OrderedDictionary]$OrderedHashtable,

        [Parameter(Mandatory=$true,Position=0,ParameterSetName='Hashtable')]
        [hashtable]$Hashtable
    )
    if($PSCmdlet.ParameterSetName -eq 'Hashtable'){
        $OrderedHashtable = $Hashtable
    }
    $OrderedHashtable
}

只是為了補充現有的,有用的答案

什么錯誤信息

可以僅在散列文字節點上指定ordered屬性。

試圖告訴你:

在hashtable文字之前放置的[ordered]只是語法糖 ,它只能在哈希表文字@{ ... } )之前工作。

您可以按如下方式確定有序哈希表文字的實際類型:

> ([ordered] @{ foo = 1 }).GetType().FullName
System.Collections.Specialized.OrderedDictionary

也就是說,PowerShell中的有序散列表文字是[System.Collections.Specialized.OrderedDictionary]類型的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM