Översikt över system av utökad typ

PowerShell använder sitt PSObject--objekt för att utöka objekttyperna på två sätt. Först ger PSObject--objektet ett sätt att visa olika vyer av specifika objekttyper. Detta kallas för att visa en anpassad vy över ett objekt. För det andra ger PSObject--objektet ett sätt att lägga till medlemmar i ett befintligt objekt. Genom att omsluta ett befintligt objekt, som kallas för basobjektet, ger PSObject--objektet ett utökat typsystem (ETS) som skript- och cmdlet-utvecklare kan använda för att manipulera .NET-objekt i gränssnittet.

Problem med cmdlet- och skriptutveckling

ETS löser två grundläggande problem:

För det första har vissa .NET-objekt inte det standardbeteende som krävs för att fungera som data mellan cmdletar.

  • Vissa .NET-objekt är "meta"-objekt (till exempel WMI-objekt, ADO-objekt och XML-objekt) vars medlemmar beskriver de data de innehåller. Men i en skriptmiljö är det de inneslutna data som är mest intressanta, inte beskrivningen av inneslutna data. ETS löser det här problemet genom att introducera begreppet Kort som anpassar det underliggande .NET-objektet till att ha den förväntade standardsemantiken.
  • Vissa .NET-objektmedlemmar namnges inkonsekvent, tillhandahåller en otillräcklig uppsättning offentliga medlemmar eller ger otillräcklig kapacitet. ETS löser det här problemet genom att introducera möjligheten att utöka .NET-objektet med ytterligare medlemmar.

För det andra är PowerShell-skriptspråket typlös eftersom en variabel inte behöver deklareras av en viss typ. Det innebär att variablerna som en skriptutvecklare skapar är av naturen typlösa. PowerShell-systemet är dock "typstyrt" eftersom det beror på att det har ett typnamn att arbeta mot för grundläggande åtgärder som att mata ut resultat eller sortera.

Därför måste en skriptutvecklare ha möjlighet att ange typen av en av sina variabler och skapa en egen uppsättning dynamiskt skrivna "objekt" som innehåller egenskaper och metoder och kan delta i det typdrivna systemet. ETS löser det här problemet genom att tillhandahålla ett gemensamt objekt för skriptspråket som har möjlighet att ange sin typ dynamiskt och lägga till medlemmar dynamiskt.

I grunden löser ETS problemet som nämnts tidigare genom att tillhandahålla PSObject- objekt, som fungerar som grund för all objektåtkomst från skriptspråket och ger en standardabstraktion för cmdlet-utvecklaren.

Cmdlet-utvecklare

För cmdlet-utvecklarna tillhandahåller ETS följande stöd:

  • Abstraktionerna för att arbeta mot objekt på ett allmänt sätt med hjälp av PSObject- objekt. ETS ger också möjlighet att öka detaljnivån efter dessa abstraktioner om det behövs.
  • Mekanismerna för att skapa ett standardbeteende för formatering, sortering, serialisering och andra systemmanipuleringar av objekttypen med hjälp av en välkänd uppsättning utökade medlemmar.
  • Det innebär att arbeta mot alla objekt med samma semantik som skriptspråket med hjälp av ett LanguagePrimitives-objekt.
  • Det innebär att dynamiskt "skriva" en hash-tabell så att resten av systemet kan arbeta mot den effektivt.

Skriptutvecklare

För skriptutvecklare har ETS följande stöd:

  • Möjligheten att referera till någon underliggande objekttyp med samma syntax ($a.x).
  • Möjligheten att komma åt utöver abstraktionen som tillhandahålls av PSObject- -objekt (till exempel åtkomst till endast anpassade medlemmar eller åtkomst till själva basobjektet).
  • Möjligheten att definiera välkända medlemmar som styr formatering, sortering, serialisering och andra manipuleringar av en objektinstans eller typ.
  • Det innebär att namnge ett objekt som en specifik typ och därmed styra arvet av dess typbaserade medlemmar.
  • Möjligheten att lägga till, ta bort och ändra utökade medlemmar.
  • Möjligheten att ändra PSObject själva objektet om det behövs.

KLASSEN PSObject

PSObject--objektet är grunden för all objektåtkomst från skriptspråket och tillhandahåller en standardabstraktion för cmdlet-utvecklaren. Den innehåller ett basobjekt (ett .NET-objekt) och alla instansmedlemmar (medlemmar, särskilt utökade medlemmar, som finns på en viss objektinstans, men inte nödvändigtvis på andra objekt av samma typ). Beroende på typen av basobjekt kan PSObject--objektet också ge implicit och explicit åtkomst till anpassade medlemmar samt eventuella typbaserade utökade medlemmar.

Objektet PSObject innehåller följande mekanismer:

  • Möjligheten att konstruera en PSObject- med eller utan ett basobjekt.
  • Möjligheten att få åtkomst till alla medlemmar i varje konstruerad PSObject objekt via en gemensam uppslagsalgoritm och möjligheten att åsidosätta den algoritmen när det behövs.
  • Möjligheten att hämta och ange typnamn för den konstruerade PSObject objekt så att skript och cmdletar kan referera till liknande PSObject objekt med samma typnamn, oavsett typ av basobjekt.

Så här skapar du en PSObject

I följande lista beskrivs hur du skapar ett PSObject- objekt:

  • Genom att anropa PSObject- .#ctor skapar konstruktorn ett nytt PSObject- objekt med ett basobjekt av PSCustomObject. Ett basobjekt av den här typen anger att PSObject--objektet inte har något meningsfullt basobjekt. Ett PSObject- objekt med den här typen av basobjekt ger dock en egenskapsväska som cmdlet-utvecklare kan ha nytta av genom att lägga till utökade medlemmar.

Utvecklare kan också ange objektets typnamn, vilket gör att objektet kan dela sina utökade medlemmar med andra PSObject objekt med samma typnamn.

  • Anropa konstruktorn PSObject .#ctor(System.Object) skapar ett nytt PSObject- objekt med ett basobjekt av typen System.Object.

    I det här fallet är typnamnet för det skapade objektet en samling av härledningshierarkin för basobjektet. Till exempel innehåller typnamnet för PSObject- som innehåller ett ProcessInfo-basobjekt följande namn:

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.MarshalByRefObject
    • System.Object
  • Anropa PSObject- . Metoden AsPSObject(System.Object) skapar en ny PSObject- objekt baserat på ett angivet objekt.

    Om det angivna objektet är av typen System.Object används det angivna objektet som basobjekt för det nya PSObject--objektet. Om det angivna objektet redan är ett PSObject- objekt returneras det angivna objektet som det är.

Bas, anpassade och utökade medlemmar

Konceptuellt använder ETS följande termer för att visa relationen mellan de ursprungliga medlemmarna i basobjektet och de medlemmar som lagts till av PowerShell. Mer information om de specifika typer av medlemmar som används av objektet PSObject finns i PSObject-klass.

Basobjektmedlemmar

Om basobjektet anges när PSObject objekt skapas, görs medlemmarna i basobjektet tillgängliga via egenskapen Medlemmar.

Anpassade medlemmar

När ett basobjekt är ett metaobjekt, ett objekt som innehåller data på ett allmänt sätt vars egenskaper "beskriver" deras inneslutna data, anpassar ETS dessa objekt till en vy som ger direkt åtkomst till data via anpassade medlemmar i PSObject- objekt. Anpassade medlemmar och basobjektmedlemmar nås via egenskapen Medlemmar.

Utökade medlemmar

Förutom de medlemmar som görs tillgängliga från basobjektet eller de anpassade medlemmar som skapats av PowerShell kan en PSObject- också definiera utökade medlemmar som utökar det ursprungliga basobjektet med ytterligare information som är användbar i skriptmiljön.

Till exempel tar alla kärn-cmdletar som tillhandahålls av PowerShell, till exempel cmdletarna Get-Content och Set-Content, en Path-parameter. För att säkerställa att dessa cmdletar och andra kan arbeta mot objekt av olika typer kan en Path-medlem läggas till i dessa objekt så att alla anger sin information på ett gemensamt sätt. Den här utökade path-medlemmen säkerställer att cmdletarna kan arbeta mot alla dessa typer även om basklassen kanske inte har en Path-medlem.

Utökade medlemmar, anpassade medlemmar och basobjektmedlemmar nås via egenskapen Medlemmar.