是否可以使用PowerShell cmdlet查看类的所有成员?

时间:2019-02-15 14:43:42

标签: powershell

正如本主题的标题所建议的那样,我正在寻求有关如何使用PowerShell查看类的所有成员的建议,无论这些成员是否被隐藏。仅使用PowerShell cmdlet就能做到这一点吗?

举个例子,假设我正在寻找System.AppDomain类的成员。如果我尝试使用Get-Member查看类成员,则缺少CurrentDomain属性:

([AppDomain] | Get-Member -View All -Force) | ? {$_.Name -eq 'CurrentDomain'}

但是,如果直接使用.NET类,则可以找到此属性,例如:

(([AppDomain]::CurrentDomain.GetAssemblies() | ? {$_.Location -Match 'mscorlib'}).gettypes() | ? {$_.Name -like 'AppDomain'}).GetMembers() | ? {$_.Name -eq 'CurrentDomain' }

使用此示例作为我前面的问题的框架,是否可以仅通过使用任何版本的PowerShell中默认可用的cmdlet来返回有关AppDomain类的CurrentDomain属性的信息?

2 个答案:

答案 0 :(得分:3)

这将获取有关CurrentDomain的信息:

[system.appdomain] | Get-Member -static | where-object {$_.name -eq "CurrentDomain"}

您可以阅读本文以获得有关Get-Member cmdlet的工作方式的更多信息。本质上,静态开关为特定类的对象提供静态方法和属性。不使用静态开关,仅提供有关该类对象实例的信息。参见Get-Member

在您的情况下,由于没有创建对象,因此您正在查找有关没有实例的特定类的信息。运行Get-Member cmdlet时,您可以查看Definition属性,并看到它们是通过使用单词static

指示的静态方法。

答案 1 :(得分:2)

tl; dr

您还可以使用System.RuntimeType类的GetMembers方法:

[System.AppDomain].GetMembers() | Where-Object {$_.Name -eq 'CurrentDomain'}

如果您想要所有成员:

[System.AppDomain].GetMembers()

这可能很长,因此您可以格式化输出以仅查看成员类型(方法,属性等),名称和定义:

[System.AppDomain].GetMembers() | Format-Table -AutoSize -Wrap MemberType, Name, @{'n'='Definition';'e'={$_.ToString()}}

更多详细信息

GetMembers返回一个MemberInfo对象的数组。对于其中的每个字段,我们保留MemberTypeName字段,并调用ToString()方法以查看成员的定义(例如,对于一个方法,它将是返回类型以及参数类型。

基于MemberType的值,您甚至可以将MemberInfo转换为MethodInfoPropertyInfoFieldInfoEventInfo,仅举几例。

关于Get-Member的注意

使用-Static表示您已经在该类上获得了足够的信息来知道它是静态的,或者不是,但是您只需要静态成员。

请注意,如果您的类不是静态的,但您使用-Static选项,则不会看到该类实例具有的成员。例如:

$obj = New-Object -TypeName System.IO.FileStream "D:\\test.txt", ([System.IO.FileMode]::CreateNew)
$obj | Get-Member

输出:

   TypeName: System.IO.FileStream

Name                      MemberType Definition
----                      ---------- ----------
BeginRead                 Method     System.IAsyncResult BeginRead(byte[] array, int offset, int numBytes, System.As...
BeginWrite                Method     System.IAsyncResult BeginWrite(byte[] array, int offset, int numBytes, System.A...
Close                     Method     System.Void Close()
...
ReadTimeout               Property   System.Int32 ReadTimeout {get;set;}
SafeFileHandle            Property   Microsoft.Win32.SafeHandles.SafeFileHandle SafeFileHandle {get;}
WriteTimeout              Property   System.Int32 WriteTimeout {get;set;}

但使用-Static

$obj | 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;}

GetMembers的工作原理与类无关,并向您显示该类本身的(静态)成员及其实例。