当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 扩展类型系统概述

作者:精品下载站 日期:2024-12-14 02:30:20 浏览:13 分类:玩电脑

扩展类型系统概述


PowerShell 使用其 PSObject 对象以两种方式扩展对象类型。首先,PSObject 对象提供了一种显示特定对象类型的不同视图的方法。这被称为显示对象的适应视图。其次,PSObject 对象提供了一种向现有对象添加成员的方法。通过包装现有对象(称为基础对象),PSObject 对象提供了一个扩展类型系统 (ETS),脚本和 cmdlet 开发人员可以使用该系统在 shell 中操作 .NET 对象。

Cmdlet 和脚本开发问题

ETS 解决了两个基本问题:

首先,某些 .NET 对象不具有充当 cmdlet 之间的数据所需的默认行为。

  • 某些 .NET 对象是“元”对象(例如:WMI 对象、ADO 对象和 XML 对象),其成员描述它们包含的数据。然而,在脚本环境中,最有趣的是所包含的数据,而不是所包含数据的描述。 ETS 通过引入适配器的概念解决了这个问题,适配器使底层 .NET 对象适应预期的默认语义。
  • 某些 .NET 对象成员的命名不一致、提供的公共成员集不足或提供的功能不足。 ETS 通过引入使用附加成员扩展 .NET 对象的功能解决了这个问题。

其次,PowerShell 脚本语言是无类型的,因为不需要将变量声明为特定类型。也就是说,脚本开发人员创建的变量本质上是无类型的。然而,PowerShell 系统是“类型驱动的”,因为它依赖于类型名称来进行基本操作(例如输出结果或排序)。

因此,脚本开发人员必须能够声明其中一个变量的类型,并构建自己的一组动态类型“对象”,其中包含属性和方法,并且可以参与类型驱动系统。 ETS 通过为脚本语言提供一个公共对象来解决这个问题,该对象能够动态声明其类型并动态添加成员。

从根本上讲,ETS 通过提供 PSObject 对象解决了前面提到的问题,该对象充当脚本语言访问所有对象的基础,并为 cmdlet 开发人员提供标准抽象。

Cmdlet 开发人员

对于 cmdlet 开发人员,ETS 提供以下支持:

  • 使用 PSObject 对象以通用方式处理对象的抽象。如果需要,ETS 还提供钻取这些抽象的能力。
  • 使用一组众所周知的扩展成员为对象类型的格式化、排序、序列化和其他系统操作创建默认行为的机制。
  • 使用与使用 LanguagePrimitives 对象的脚本语言相同的语义对任何对象进行操作的方法。
  • 动态“键入”哈希表的方法,以便系统的其余部分可以有效地对其进行操作。

脚本开发人员

对于脚本开发人员,ETS 提供以下支持:

  • 能够使用相同的语法 ($a.x) 引用任何基础对象类型。
  • 访问超出由 PSObject 对象提供的抽象的能力(例如仅访问适应的成员,或访问基础对象本身)。
  • 能够定义控制对象实例或类型的格式化、排序、序列化和其他操作的众所周知的成员。
  • 将对象命名为特定类型的方法,从而控制其基于类型的成员的继承。
  • 添加、删除和修改扩展成员的能力。
  • 如果需要的话,能够操纵PSObject对象本身。

PSObject 类

PSObject 对象是脚本语言访问所有对象的基础,并为 cmdlet 开发人员提供标准抽象。它包含一个基础对象(.NET 对象)和任何实例成员(成员,特别是扩展成员,存在于特定对象实例上,但不一定存在于相同类型的其他对象上)。根据基础对象的类型,PSObject 对象还可能提供对改编成员以及任何基于类型的扩展成员的隐式和显式访问。

PSObject 对象提供以下机制:

  • 能够构造带有或不带有基础对象的PSObject
  • 能够通过通用查找算法访问每个构造的 PSObject 对象的所有成员,并能够在需要时覆盖该算法。
  • 能够获取和设置所构造的 PSObject 对象的类型名称,以便脚本和 cmdlet 可以通过相同的类型名称引用类似的 PSObject 对象,而不管类型如何他们的基础对象。

如何构造 PSObject

以下列表描述了创建 PSObject 对象的方法:

  • 调用 PSObject .#ctor 构造函数会创建一个新的 PSObject 对象,其基础对象为 PSCustomObject。这种类型的基础对象表明PSObject对象没有有意义的基础对象。但是,具有此类基本对象的 PSObject 对象确实提供了一个属性包,cmdlet 开发人员可以通过添加扩展成员发现该属性包很有帮助。

开发人员还可以指定对象类型名称,这允许该对象与具有相同类型名称的其他 PSObject 对象共享其扩展成员。

  • 调用 PSObject .#ctor(System.Object) 构造函数创建一个新的 PSObject 对象,其基础对象为 System.Object 类型。

    在这种情况下,创建的对象的类型名称是基础对象的派生层次结构的集合。例如,包含 ProcessInfo 基础对象的 PSObject 的类型名称将包括以下名称:

    • System.Diagnostics.Process
  • System.ComponentModel.Component
  • 系统.MarshalByRefObject
  • 系统对象
  • 调用 PSObject .AsPSObject(System.Object) 方法会根据提供的对象创建一个新的 PSObject 对象。

    如果提供的对象属于 System.Object 类型,则提供的对象将用作新 PSObject 对象的基础对象。如果提供的对象已经是 PSObject 对象,则按原样返回提供的对象。

  • 基础成员、改编成员和扩展成员

    从概念上讲,ETS 使用以下术语来显示基础对象的原始成员与 PowerShell 添加的成员之间的关系。有关 PSObject 对象使用的特定类型成员的详细信息,请参阅 PSObject 类。

    基础对象成员

    如果在构造 PSObject 对象时指定了基础对象,则可以通过 Members 属性使用基础对象的成员。

    改编成员

    当基础对象是元对象(以通用方式包含数据,其属性“描述”其所包含的数据)时,ETS 会将这些对象调整为允许通过改编的成员直接访问数据的视图。 >PSObject 对象。适应成员和基础对象成员可通过 Members 属性访问。

    扩展会员

    除了从基础对象提供的成员或由 PowerShell 创建的改编成员之外,PSObject 还可以定义扩展成员,这些扩展成员使用在脚本编写中有用的附加信息来扩展原始基础对象。环境。

    例如,PowerShell 提供的所有核心 cmdlet(例如 Get-Content 和 Set-Content cmdlet)都采用路径参数。为了确保这些 cmdlet 和其他 cmdlet 可以针对不同类型的对象工作,可以将 Path 成员添加到这些对象中,以便它们都以通用方式声明其信息。此扩展 Path 成员确保 cmdlet 可以针对所有这些类型工作,即使基类可能没有 Path 成员也是如此。

    扩展成员、改编成员和基础对象成员都可以通过 Members 属性访问。

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯