Search code examples
powershelldictionaryordereddictionarystrong-typing

Strong typing dictionary contents


As part of a refactor of a large PowerShell program from PS2.0, functions and scripting quick practices to PS5.0, classes and programming best practices, I have been moving to strong typing everywhere and finding some places where that brings up questions. The latest one being hash tables. With both [Array] and [Hashtable] you can have a mix of content, which then makes enumerating that collection impossible to strongly type. For Arrays you have options like [String[]] or moving to Generic Lists with [System.Collections.Generic.List[String]]. But Dictionaries seem to pose a problem. I can't find a way to create a dictionary and limit it's values to a particular type. Something like [System.Collections.Specialized.OrderedDictionary[Int32,Int32]] fails. So, IS there a way to make Dictionaries and OrderedDictionaries with strong typing of the index, the value or both? And if there isn't a way, is this considered a bit of a problem that must be overcome, or not a problem and if so why is it not a problem?


Solution

  • You can create generic dictionaries, but as per Create new System.Collections.Generic.Dictionary object fails in PowerShell you have to use a backtick to escape the comma in the list of generic type parameters:

    e.g.

    PS> $dict = new-object System.Collections.Generic.Dictionary[int`,string]
    

    Note that PowerShell will still do its best to coerce types, so it will only throw an exception if it can't convert the type:

    PS> $dict.Add("1", "aaa") # equivalent to $dict.Add(1, "aaa")
    

    And I don't believe there is a generic OrderedDictionary out-of-the-box, which is probably why that fails :-)

    PS> new-object System.Collections.Specialized.OrderedDictionary[Int32`,Int32]
    New-Object: Cannot find type [System.Collections.Specialized.OrderedDictionary[Int32,Int32]]: verify that the assembly containing this type is loaded.