Bagikan melalui


Gambaran Umum Sistem Tipe Yang Diperluas

PowerShell menggunakan objek PSObject untuk memperluas jenis objek dengan dua cara. Pertama, objek PSObject menyediakan cara untuk menampilkan tampilan yang berbeda dari jenis objek tertentu. Ini disebut sebagai menampilkan tampilan objek yang diadaptasi. Kedua, objek PSObject menyediakan cara untuk menambahkan anggota ke objek yang ada. Bersama-sama, dengan membungkus objek yang ada, disebut sebagai objek dasar, objek PSObject menyediakan sistem jenis diperluas (ETS) yang dapat digunakan pengembang skrip dan cmdlet untuk memanipulasi objek .NET dalam shell.

Masalah Pengembangan Cmdlet dan Skrip

ETS menyelesaikan dua masalah mendasar:

Pertama, beberapa Objek .NET tidak memiliki perilaku default yang diperlukan untuk bertindak sebagai data di antara cmdlet.

  • Beberapa objek .NET adalah objek "meta" (misalnya: Objek WMI, objek ADO, dan objek XML) yang anggotanya menjelaskan data yang dikandungnya. Namun, dalam lingkungan pembuatan skrip, ini adalah data yang terkandung yang paling menarik, bukan deskripsi data yang terkandung. ETS menyelesaikan masalah ini dengan memperkenalkan gagasan Adapter yang menyesuaikan objek .NET yang mendasar untuk memiliki semantik default yang diharapkan.
  • Beberapa anggota Objek .NET diberi nama yang tidak konsisten, menyediakan sekumpulan anggota publik yang tidak mencukupi, atau memberikan kemampuan yang tidak mencukupi. ETS menyelesaikan masalah ini dengan memperkenalkan kemampuan untuk memperluas objek .NET dengan anggota tambahan.

Kedua, bahasa pembuatan skrip PowerShell tanpa jenis karena variabel tidak perlu dideklarasikan dari jenis tertentu. Artinya, variabel yang dibuat pengembang skrip bersifat tanpa jenis . Namun, sistem PowerShell "berbasis jenis" karena bergantung pada memiliki nama jenis untuk dioperasikan untuk operasi dasar seperti menghasilkan hasil atau pengurutan.

Oleh karena itu, pengembang skrip harus memiliki kemampuan untuk menyatakan jenis salah satu variabel mereka dan membangun sekumpulan "objek" yang diketik secara dinamis yang berisi properti dan metode dan dapat berpartisipasi dalam sistem berbasis jenis. ETS memecahkan masalah ini dengan menyediakan objek umum untuk bahasa skrip yang memiliki kemampuan untuk menyatakan jenisnya secara dinamis dan menambahkan anggota secara dinamis.

Pada dasarnya, ETS menyelesaikan masalah yang disebutkan sebelumnya dengan menyediakan objek PSObject, yang bertindak sebagai dasar semua akses objek dari bahasa skrip dan menyediakan abstraksi standar untuk pengembang cmdlet.

Pengembang Cmdlet

Untuk pengembang cmdlet, ETS menyediakan dukungan berikut:

  • Abstraksi untuk bekerja terhadap objek dengan cara generik menggunakan objek PSObject. ETS juga menyediakan kemampuan untuk menelusuri abstraksi ini jika diperlukan.
  • Mekanisme untuk membuat perilaku default untuk memformat, mengurutkan, serialisasi, dan manipulasi sistem lainnya dari jenis objek mereka menggunakan sekumpulan anggota yang diperluas yang terkenal.
  • Cara untuk beroperasi terhadap objek apa pun menggunakan semantik yang sama dengan bahasa skrip menggunakan objek LanguagePrimitives.
  • Cara untuk secara dinamis "mengetik" tabel hash sehingga sisa sistem dapat beroperasi terhadapnya secara efektif.

Pengembang Skrip

Untuk pengembang skrip, ETS menyediakan dukungan berikut:

  • Kemampuan untuk mereferensikan jenis objek yang mendasar menggunakan sintaks yang sama ($a.x).
  • Kemampuan untuk mengakses di luar abstraksi yang disediakan oleh objek PSObject (seperti hanya mengakses anggota yang disesuaikan, atau mengakses objek dasar itu sendiri).
  • Kemampuan untuk menentukan anggota terkenal yang mengontrol pemformatan, pengurutan, serialisasi, dan manipulasi lain dari instans atau jenis objek.
  • Cara untuk memberi nama objek sebagai jenis tertentu dan dengan demikian mengontrol pewarisan anggota berbasis jenisnya.
  • Kemampuan untuk menambahkan, menghapus, dan memodifikasi anggota yang diperluas.
  • Kemampuan untuk memanipulasi objek PSObject itu sendiri jika diperlukan.

Kelas PSObject

Objek PSObject adalah dasar dari semua akses objek dari bahasa pembuatan skrip dan menyediakan abstraksi standar untuk pengembang cmdlet. Ini berisi objek dasar (objek .NET) dan anggota instans apa pun (anggota, khususnya anggota yang diperluas, yang ada pada instans objek tertentu sementara tidak selalu pada objek lain dengan jenis yang sama). Tergantung pada jenis objek dasar, objek PSObject mungkin juga memberikan akses implisit dan eksplisit ke anggota yang disesuaikan serta anggota yang diperluas berbasis jenis apa pun.

Objek PSObject menyediakan mekanisme berikut:

  • Kemampuan untuk membangun PSObject dengan atau tanpa objek dasar.
  • Kemampuan untuk mengakses semua anggota dari setiap objek PSObject yang dibangun melalui algoritma pencarian umum dan kemampuan untuk mengambil alih algoritma tersebut jika diperlukan.
  • Kemampuan untuk mendapatkan dan mengatur nama jenis objek PSObject yang dibangun sehingga skrip dan cmdlet dapat mereferensikan objek PSObject serupa dengan nama jenis yang sama, terlepas dari jenis objek dasarnya.

Cara Membuat PSObject

Daftar berikut ini menjelaskan cara membuat objek PSObject:

  • Memanggil konstruktor PSObject .#ctor membuat objek PSObject baru dengan objek dasar PSCustomObject. Objek dasar dari jenis ini menunjukkan bahwa objek PSObject tidak memiliki objek dasar yang bermakna. Namun, objek PSObject dengan jenis objek dasar ini memang menyediakan tas properti yang dapat dianggap bermanfaat oleh pengembang cmdlet dengan menambahkan anggota yang diperluas.

Pengembang juga dapat menentukan nama jenis objek, yang memungkinkan objek ini berbagi anggota yang diperluas dengan PSObject lainnya objek dengan nama jenis yang sama.

  • Memanggil konstruktor PSObject .#ctor(System.Object) membuat objek PSObject baru dengan objek dasar tipe System.Object.

    Dalam hal ini, nama jenis untuk objek yang dibuat adalah kumpulan hierarki derivasi objek dasar. Misalnya, nama jenis untuk PSObject yang berisi objek dasar ProcessInfo akan menyertakan nama berikut:

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.MarshalByRefObject
    • System.Object
  • Memanggil PSObject . Metode AsPSObject(System.Object) membuat objek PSObject baru berdasarkan objek yang disediakan.

    Jika objek yang disediakan berjenis System.Object, objek yang disediakan digunakan sebagai objek dasar untuk objek PSObject baru. Jika objek yang disediakan sudah menjadi objek PSObject, objek yang disediakan dikembalikan apa adanya.

Anggota dasar, diadaptasi, dan diperluas

Secara konseptual, ETS menggunakan istilah berikut untuk memperlihatkan hubungan antara anggota asli objek dasar dan anggota yang ditambahkan oleh PowerShell. Untuk informasi selengkapnya tentang jenis anggota tertentu yang digunakan oleh objek PSObject, lihat kelas PSObject.

Anggota objek dasar

Jika objek dasar ditentukan saat membuat objek PSObject, maka anggota objek dasar disediakan melalui properti Anggota.

Anggota yang diadaptasi

Ketika objek dasar adalah meta-object, objek yang berisi data dengan cara generik yang propertinya "menjelaskan" data yang terkandung, ETS mengadaptasi objek tersebut ke tampilan yang memungkinkan akses langsung ke data melalui anggota yang disesuaikan dari objek PSObject. Anggota yang diadaptasi dan anggota objek dasar diakses melalui properti Anggota.

Anggota yang diperluas

Selain anggota yang tersedia dari objek dasar atau anggota adaptasi yang dibuat oleh PowerShell, PSObject juga dapat menentukan anggota yang diperluas yang memperluas objek dasar asli dengan informasi tambahan yang berguna di lingkungan pembuatan skrip.

Misalnya, semua cmdlet inti yang disediakan oleh PowerShell, seperti cmdlet Get-Content dan Set-Content, mengambil parameter Jalur. Untuk memastikan bahwa cmdlet ini, dan lainnya, dapat bekerja melawan objek dari berbagai jenis, anggota Jalur dapat ditambahkan ke objek tersebut sehingga semuanya menyatakan informasi mereka dengan cara yang sama. Anggota Jalur yang diperluas ini memastikan bahwa cmdlet dapat bekerja terhadap semua jenis tersebut meskipun ada kelas dasar mungkin tidak memiliki anggota Jalur.

Anggota yang diperluas, anggota yang diadaptasi, dan anggota objek dasar semuanya diakses melalui properti Anggota.