Tulajdonságok és metódusok dinamikus elérése

Nagyon hatékony programozási lehetőség, hogy mind a tulajdonságokat, mind a metódusokat nem csak statikus módon, hanem futásidőben kiértékelődő kifejezés alapján is elérhetjük. Ez így elég bonyolultnak tűnhet, így inkább nézzük meg mindezt néhány egyszerű példán:

function Szilveszteri-buli {

    param(

        [validateset("Napok", "Órák", "Percek", "Másodpercek")]

        $mértékegység = "Napok"

    )

    $dict = @{

                Napok = "Days"

                Órák = "Hours"

                Percek = "Minutes"

                Másodpercek = "Seconds"

            }

    $timespan = (Get-Date -Month 12 -Day 31 -Hour 20 -Minute 0 -Second 0) - (get-date)

    $timespan."Total$($dict.$mértékegység)"

}

A fenti függvény megadja, hogy mennyi idő van az aktuális év szilveszteri bulijáig, feltételezve, hogy az szilveszter napján este 8 órakor kezdődik. A függvény paramétereként meg lehet adni, hogy milyen mértékegységben kérjük ezt az értéket: napokba, órákban, percekben vagy másodpercekben. A függvény törzsében a kért mértékegységet át kell fordítanunk angolra, majd a leendő buli időpontja és a mostani időpont különbségét képzem, majd ennek veszem a „TotalDays”, „TotalHours”, „TotalMinutes” vagy „TotalSeconds” tulajdonságát.

Itt, a függvény utolsó sorában az időkülönbség (timespan) különböző tulajdonságait egy futás időben létrejövő szöveges adattal képzem ("Total$($dict.$mértékegység)"). A Total előtag mellé a $dict szótár $mértékegység angol megfelelőjét biggyesztem hozzá. Azaz megspóroltam egy csomó IF/ELSEIF feltétel végrehajtását (ha a mértékegység Napok, akkor vegyük a TotalDays tulajdonságot, egyébként ha a mértékegység Órák, akkor vegyük a TotalHours tulajdonságot, stb.)

Ha ezt futtatjuk, akkor ilyen eredményeket kapunk:

PS C:\> Szilveszteri-buli -mértékegység Napok

88,8506018518518

PS C:\> Szilveszteri-buli -mértékegység Órák

2132,41361083308

PS C:\> Szilveszteri-buli -mértékegység Másodpercek

7676687

PowerShell 4.0-óta ugyanezt tehetjük a metódusok hívásánál is. Nézzünk a szövegek átalakítására egy egyszerű függvényt:

function Szövegalakítás {

    param(

        [string] $szöveg,

        [ValidateSet("Kisbetűs", "Nagybetűs", "Tördelt", "Betűkre")]

            $formátum = "Nagybetűs"

    )

    $dict = @{

                Kisbetűs = "ToLower"

                Nagybetűs = "ToUpper"

                Tördelt = "Split"

                Betűkre = "ToCharArray"

            }

    $szöveg.($dict.$formátum)()

}

Itt is hasonló a logika, mint az előző példafüggvénynél. A szöveget különböző módokon lehet átalakítani, ezt a $formátum paraméterrel adom meg. Ezt a $dict szótárral a megfelelő metódusnévre alakítom, majd a $szöveg megfelelő metódusát ez alapján dinamikusan hívom meg.

PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Kisbetűs

powershell 5.0

PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Nagybetűs

POWERSHELL 5.0

PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Tördelt

PowerShell

5.0

PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Betűkre

P

o

w

e

r

S

h

e

l

l

 

5

.

0

Megjegyzés

A metódusok gömbölyű zárójelpárja nem tartozhat bele a futásidőben létrejövő kifejezésbe, az mindenképpen statikus kell legyen, mint ahogy a fenti példában ($szöveg.($dict.$formátum)()) a zárójelpár nem a szótárból jön, hanem oda van írva a sor végére.

Ezekkel a dinamikus lehetőségekkel nagyon tömör és hatékony szkripteket, függvényeket készíthetünk, bár a kód olvasása, értelmezése esetleg kicsit nagyobb kihívást jelenthet mások számára.



Word To HTML Converter