gpt4 book ai didi

powershell - 为什么 `[SomeType] | Get-Member -Static`返回 `SomeType`的静态成员而不是 `System.RuntimeType`的静态成员?

转载 作者:行者123 更新时间:2023-12-03 01:27:05 24 4
gpt4 key购买 nike

让我们举个例子。如果正确理解,System.IO.FileStream是一个类,但是[System.IO.FileStream]是一个对象:它是System.RuntimeType类的实例。

如果运行[System.IO.FileStream] | Get-Member,我将获得System.RuntimeType的成员(从技术上讲,是其实例的成员):

   TypeName: System.RuntimeType

Name MemberType Definition
---- ---------- ----------
AsType Method type AsType()
Clone Method System.Object Clone()
Equals Method bool Equals(System.Object obj), bool Equals(type o)
FindInterfaces Method type[] FindInterfaces(System.Reflection.TypeFilter filter, System.Object filterCriteria)
...
TypeHandle Property System.RuntimeTypeHandle TypeHandle {get;}
TypeInitializer Property System.Reflection.ConstructorInfo TypeInitializer {get;}
UnderlyingSystemType Property System.Type UnderlyingSystemType {get;}

根据 the documentation:

To get information about static members, the members of the class, not of the instance, use the Static parameter.



但是如果我现在运行 [System.IO.FileStream] | Get-Member -Static,我会得到:
   TypeName: System.IO.FileStream

Name MemberType Definition
---- ---------- ----------
Equals Method static bool Equals(System.Object objA, System.Object objB)
ReferenceEquals Method static bool ReferenceEquals(System.Object objA, System.Object objB)
Synchronized Method static System.IO.Stream Synchronized(System.IO.Stream stream)
Null Property static System.IO.Stream Null {get;}

Q1。这些是System.IO.FileStream的静态成员,而不是System.RuntimeType。这是为什么?

The documentation还说:

We use :: to indicate to Windows PowerShell that we want to work with a static method or property.



这使我意识到 [System.IO.FileStream]::Null引用了 Null类的静态属性 System.IO.FileStream

Q2。这是否意味着Powershell有时将[System.IO.FileStream]视为System.IO.FileStream类(在处理静态成员时),有时又将其视为System.RuntimeType的实例?

最佳答案

默认情况下,不带Get-Member -Static 始终对其输入对象的类型起作用。
[System.IO.FileStream]是PowerShell类型文字([<type-name>])的实例,其类型为System.RuntimeType,这是PowerShell的内部类,派生自 System.Reflection.TypeInfo ,最终是 System.Type

因此,[System.IO.FileStream] | Get-Member输出有关System.RuntimeType成员的信息-任何类型的文字也将输出(例如[int] | Get-Member将产生相同的输出)。

相比之下, Get-Member-Static :

如果碰巧是System.RunTimeType实例(例如类型文字[System.IO.FileStream]),

  • 会对输入对象本身起作用;否则,照常操作输入对象的类型。
  • 仅报告输入对象/类型的静态成员。

  • 因此,[System.IO.FileStream] | Get-Member -Static报告 System.IO.FileStream 类型的静态成员-就像传递System.IO.FileStream类型的实例一样;例如[System.IO.FileStream]::new($PROFILE, 'Open') | Get-Member -Static
    奇怪的是,从PowerShell Core 7.0
    开始, ,您无法使用Get-Member通过类型来请求实例成员;获取类型的实例成员的唯一方法是传递实际实例作为输入;但是,挑战在于实例并非总是很容易获得,因此按类型获取实例成员会有所帮助,
    this GitHub issue请求。

    同时,您可以在类型上调用.GetMembers(),如您自己的答案here所示。

    关于powershell - 为什么 `[SomeType] | Get-Member -Static`返回 `SomeType`的静态成员而不是 `System.RuntimeType`的静态成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61584267/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com