首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`[SomeType] \Get成员-Static`返回的是‘SomeType’的静态成员,而不是`System.RuntimeType`的静态成员?

为什么`[SomeType] \Get成员-Static`返回的是‘SomeType’的静态成员,而不是`System.RuntimeType`的静态成员?
EN

Stack Overflow用户
提问于 2020-05-04 02:27:29
回答 1查看 47关注 0票数 1

让我们举个例子。如果正确理解,System.IO.FileStream是类,但[System.IO.FileStream]是对象:它是类System.RuntimeType的实例。

如果我运行[System.IO.FileStream] | Get-Member,我将得到System.RuntimeType的成员(从技术上讲,它的实例):

代码语言:javascript
复制
   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;}

根据文献资料

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

但是如果我现在运行[System.IO.FileStream] | Get-Member -Static,我会得到:

代码语言:javascript
复制
   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;}

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

文献资料还说:

我们使用::向PowerShell表示我们希望使用静态方法或属性。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-04 03:30:41

默认情况下,不带-StaticGet成员 总是对输入对象E 213的类型E 112执行操作。

[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.IO.FileStream];否则,与往常一样,将对输入对象的类型进行操作。
  • 只报告输入对象/类型的静态成员。

因此,[System.IO.FileStream] | Get-Member -Static报告System.IO.FileStream类型的静态成员,就像传递System.IO.FileStream类型的实例一样;例如,[System.IO.FileStream]::new($PROFILE, 'Open') | Get-Member -Static

一个奇怪的遗漏是,无法使用Get-Member 请求实例成员E 264E 165按类型< PowerShell >E 266>;获取类型实例成员的唯一方法是将实际实例作为输入传递;然而,挑战是实例并不总是容易获得,因此按类型获取实例成员将有帮助,即这个GitHub问题请求。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61584267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档