正如本主题的标题所建议的那样,我正在寻求有关如何使用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属性的信息?
答案 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)
您还可以使用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
对象的数组。对于其中的每个字段,我们保留MemberType
和Name
字段,并调用ToString()
方法以查看成员的定义(例如,对于一个方法,它将是返回类型以及参数类型。
基于MemberType的值,您甚至可以将MemberInfo
转换为MethodInfo
,PropertyInfo
,FieldInfo
或EventInfo
,仅举几例。
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
的工作原理与类无关,并向您显示该类本身的(静态)成员及其实例。