Kiterjesztett típusrendszer áttekintése

A PowerShell a PSObject objektumával két módon terjeszti ki az objektumtípusokat. Először is a PSObject objektum lehetővé teszi az adott objektumtípusok különböző nézeteinek megjelenítését. Ezt úgy nevezzük, hogy egy objektum adaptált nézetét jeleníti meg. Másodszor, a PSObject objektum lehetővé teszi tagok hozzáadását a meglévő objektumhoz. A psObject objektum az alapobjektumnak nevezett meglévő objektum körbefuttatásával egy kiterjesztett típusrendszert (ETS) biztosít, amellyel a szkript- és parancsmagfejlesztők a .NET-objektumokat manipulálhatják a rendszerhéjon belül.

Parancsmag- és szkriptfejlesztési problémák

Az ETS két alapvető problémát old meg:

Először is egyes .NET-objektumok nem rendelkeznek a parancsmagok közötti adatként való működéshez szükséges alapértelmezett viselkedéssel.

  • Egyes .NET-objektumok "meta" objektumok (például WMI-objektumok, ADO-objektumok és XML-objektumok), amelyek tagjai az általuk tárolt adatokat írják le. A szkriptelési környezetben azonban a tartalmazott adatok a legérdekesebbek, nem pedig a benne foglalt adatok leírása. Az ETS azzal oldja meg ezt a problémát, hogy bemutatja az adapterek fogalmát, amelyek a mögöttes .NET-objektumot a várt alapértelmezett szemantikához igazítják.
  • Egyes .NET-objektumtagok neve inkonzisztens, nem megfelelő számú nyilvános tagot biztosít, vagy nem biztosít elegendő képességet. Az ETS úgy oldja meg ezt a problémát, hogy bevezeti a .NET-objektum további tagokkal való kiterjesztésének lehetőségét.

Másodszor, a PowerShell-szkriptnyelv típus nélküli abban az esetben, ha egy változót nem kell egy adott típusú deklarálni. Vagyis a szkriptfejlesztő által létrehozott változók természete típus nélküli. A PowerShell-rendszer azonban "típusalapú", mivel attól függ, hogy rendelkezik-e típusnévvel az alapműveletekhez, például az eredmények kimenetéhez vagy a rendezéshez.

Ezért a szkriptfejlesztőknek meg kell tudniuk adni az egyik változójuk típusát, és saját dinamikusan beírt "objektumokat" kell létrehozniuk, amelyek tulajdonságokat és metódusokat tartalmaznak, és részt vehetnek a típusalapú rendszerben. Az ETS úgy oldja meg ezt a problémát, hogy egy gyakori objektumot biztosít a szkriptnyelvhez, amely képes dinamikusan állapotba helyezni a típust, és dinamikus tagokat hozzáadni.

Az ETS alapvetően úgy oldja meg a korábban említett problémát, hogy megadja a PSObject objektumot, amely a szkriptelési nyelv összes objektumhozzáférésének alapjaként szolgál, és szabványos absztrakciót biztosít a parancsmag fejlesztőjének.

Parancsmagfejlesztők

A parancsmagfejlesztők számára az ETS a következő támogatást nyújtja:

  • A PSObject objektum használatával általánosan használható absztrakciók az objektumok ellen. Az ETS emellett lehetővé teszi ezen absztrakciók részletezésének lehetőségét is, ha szükséges.
  • Az objektumtípusuk formázására, rendezésére, szerializálására és más rendszermódosításokra vonatkozó alapértelmezett viselkedés létrehozására szolgáló mechanizmusok a kiterjesztett tagok jól ismert készletével.
  • A LanguagePrimitives objektumot használó szkriptnyelvvel megegyező szemantikát használó objektumokon való működés módja.
  • A kivonattáblák dinamikus "beírásának" eszköze, hogy a rendszer többi része hatékonyan működjön rajta.

Szkriptfejlesztők

A szkriptfejlesztők számára az ETS a következő támogatást nyújtja:

  • Bármely mögöttes objektumtípusra ugyanazzal a szintaxissal ($a.x) hivatkozhat.
  • Az PSObject objektum által biztosított absztrakción túli hozzáférés lehetősége (például csak az adaptált tagok elérése vagy az alapobjektum elérése).
  • Az objektumpéldányok vagy -típusok formázását, rendezését, szerializálását és egyéb manipulációit vezérlő ismert tagok definiálásának lehetősége.
  • Azt jelenti, hogy egy objektumot egy adott típusnak nevezünk el, és ezáltal szabályozni a típusalapú tagok öröklését.
  • A kiterjesztett tagok hozzáadásának, eltávolításának és módosításának lehetősége.
  • Az PSObject objektum szükség esetén történő módosításának lehetősége.

A PSObject osztály

A PSObject objektum a szkriptnyelv összes objektumhozzáférésének alapja, és szabványos absztrakciót biztosít a parancsmag fejlesztőjének. Alapobjektumot (.NET-objektumot) és bármely példánytagot (tagokat, különösen kiterjesztett tagokat) tartalmaz, amelyek egy adott objektumpéldányon vannak jelen, de nem feltétlenül azonos típusú objektumokon. Az alapobjektum típusától függően a PSObject objektum implicit és explicit hozzáférést is biztosíthat az adaptált tagokhoz, valamint bármilyen típusalapú kiterjesztett taghoz.

A PSObject objektum a következő mechanizmusokat biztosítja:

  • Az PSObject létrehozása alapobjektummal vagy anélkül.
  • Az egyes létrehozott PSObject objektum összes tagjának hozzáférése egy közös keresési algoritmuson keresztül, és szükség esetén felülbírálható az algoritmus.
  • A létrehozott PSObject objektumok típusneveinek lekérése és beállítása, hogy a szkriptek és parancsmagok hasonló PSObject objektumokra hivatkozhassanak ugyanazzal a típusnévvel, függetlenül az alapobjektum típusától.

PSObject létrehozása

Az alábbi lista ismerteti, hogyan hozhat létre PSObject objektumot:

  • A PSObject .#ctor konstruktor meghívásával létrehoz egy új PSObject objektumot a PSCustomObject alapobjektumával. Az ilyen típusú alapobjektum azt jelzi, hogy az PSObject objektumnak nincs értelmes alapobjektuma. Az ilyen típusú alapobjektumokkal rendelkező PSObject objektum azonban olyan tulajdonságcsomagot biztosít, amelyet a parancsmag fejlesztői hasznosnak találnak a kiterjesztett tagok hozzáadásával.

A fejlesztők megadhatják az objektumtípus nevét is, amely lehetővé teszi, hogy az objektum megossza a kiterjesztett tagjait más PSObject azonos típusú objektumokkal.

  • A PSObject .#ctor(System.Object) konstruktor meghívása új PSObject objektumot hoz létre egy System.Object típusú alapobjektummal.

    Ebben az esetben a létrehozott objektum típusneve az alapobjektum származtatási hierarchiájának gyűjteménye. A ProcessInfo alapobjektumot tartalmazó PSObject típusneve például a következő neveket tartalmazza:

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.MarshalByRefObject
    • System.Object
  • A PSObject meghívása. Az AsPSObject(System.Object) metódus egy új PSObject objektumot hoz létre egy megadott objektum alapján.

    Ha a megadott objektum System.Object típusú, a rendszer a megadott objektumot használja az új PSObject objektum alapobjektumaként. Ha a megadott objektum már PSObject objektum, a rendszer a megadott objektumot adja vissza.

Alaptagok, adaptált és kiterjesztett tagok

Az ETS elméletileg a következő kifejezésekkel jeleníti meg az alapobjektum eredeti tagjai és a PowerShell által hozzáadott tagok közötti kapcsolatot. Az PSObject objektum által használt tagtípusokról további információt PSObject osztály.

Alapobjektum-tagok

Ha az alapobjektum a PSObject objektumok létrehozásakor van megadva, akkor az alapobjektum tagjai a Tagok tulajdonságon keresztül lesznek elérhetők.

Adaptált tagok

Ha egy alapobjektum egy metaobjektum, amely olyan általános módon tartalmaz adatokat, amelyek tulajdonságai "leírják" a bennük lévő adatokat, az ETS az objektumokat egy olyan nézethez igazítja, amely lehetővé teszi az adatok közvetlen elérését a PSObject objektum adaptált tagjain keresztül. Az adaptált tagok és az alapobjektum-tagok a Tagok tulajdonságon keresztül érhetők el.

Kiterjesztett tagok

Az alapobjektumból vagy a PowerShell által létrehozott adaptált tagokból elérhetővé tett tagokon kívül egy PSObject is meghatározhat kiterjesztett tagokat, amelyek kibővítik az eredeti alapobjektumot a szkriptelési környezetben hasznos további információkkal.

A PowerShell által biztosított összes alapvető parancsmag, például a Get-Content és a Set-Content parancsmagok például egy Path paramétert használnak. Annak érdekében, hogy ezek a parancsmagok és mások különböző típusú objektumok ellen is működjenek, az Elérési út tagokat hozzá lehet adni ezekhez az objektumokhoz, hogy az összes információjuk közös módon legyen megadva. Ez a kiterjesztett elérésiút-tag biztosítja, hogy a parancsmagok az összes ilyen típussal szemben működjön, annak ellenére, hogy az alaposztály nem rendelkezik Elérési út taggal.

A kiterjesztett tagok, az adaptált tagok és az alapobjektum-tagok mind a Tagok tulajdonságon keresztül érhetők el.