为什么"[某种类型] |Get-Member -Static' 返回 'SomeType' 的静态成员,而不是



让我们举个例子。如果理解正确,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;}

根据文档:

若要获取有关静态成员的信息,请使用Static参数,类的成员(而不是实例的成员)。

但是如果我现在运行[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;}

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

文档还说:

我们使用::向 Windows PowerShell 指示我们想要使用静态方法或属性。

这让我意识到[System.IO.FileStream]::Null指的是类System.IO.FileStream的静态属性Null

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

默认情况下,不带-StaticGet-Member始终作用于其输入对象的类型

[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按类型请求实例成员;获取类型实例成员的唯一方法是将实际实例作为输入传递;但是,挑战在于实例并不总是那么容易获得,因此类型获取实例成员会很有帮助,此 GitHub 发出请求。

同时,您可以在类型上调用.GetMembers(),正如您在此处自己的答案中所演示的那样。

最新更新