为什么 GetType() 返回的类型与 Get-Member 不同?
PS C:\> Find-Module -Name vssetup | Install-Module
PS C:\> $x = (Get-VSSetupInstance)[0]
PS C:\> $x.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Instance System.Object
PS C:\> $x | Get-Member
TypeName: Microsoft.VisualStudio.Setup.Instance
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
...
最佳答案
报告的类型相同,只是其表示形式不同。
从 PowerShell 7.3.4 开始,System.Reflection.TypeInfo
的用于显示格式.GetType()
返回的实例 - 不幸的是 - 不反射(reflect)类型的命名空间限定名称,而 Get-Member
的输出确实如此。
要根据 .GetType()
调用获取类型的命名空间限定名称,只需访问返回对象的 .FullName
属性即可:
# -> 'Microsoft.VisualStudio.Setup.Instance'
$x.GetType().FullName
请注意,Get-Member
的目的不仅仅报告 .NET 类型的身份,而且还报告它的成员 - 因此有关 Equals
、GetHashCode
等的附加信息(通过 Microsoft.PowerShell.Commands.MemberDefinition
实例的显示格式进行调节, >Get-Member
输出)。
因此,显示格式的细节在设计上是不同的。
顺便说一句:
不幸的是,
Microsoft.PowerShell.Commands.MemberDefinition
实例在提供有关 .NET 类型成员的有用且格式良好的高级信息时,它们< em>不提供对System.Reflection.MemberInfo
所提供的完整 .NET 反射 API 的访问- 直接在类型上调用的反射方法输出的派生实例(.GetType().GetMember(...)
等)。参见this answer对于函数
Get-NativeMember
,它提供与Get-Member
类似的便利,但返回完整的实际System.Reflection.MemberInfo
派生实例访问 .NET 的反射 API;请注意,它仅针对类型 native 成员执行此操作(不适用于通过 PowerShell 的 ETS(扩展类型系统)提供的成员)。
关于powershell - .GetType() 和 Get-Member 之间的类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76377743/