让我们举个例子。如果理解正确,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
的实例?
默认情况下,不带-Static
Get-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()
,正如您在此处自己的答案中所演示的那样。