如何动态获取静态类的值?属性?

时间:2014-05-28 00:26:27

标签: powershell

我想循环一个静态类的属性。 [EnvDTE.Constants] | get-member -static | where-object {$_.MemberType -eq "Property" -and $_.Name -like 'vsP*'}

而不是去手动输入名称,如: [EnvDTE.Constants]::vsProjectItemKindMisc

尝试:

  • | Select-Object {$_.Value}
  • | Select-Object {$([EnvDTE.Constants]::$_.Name)}
  • | Invoke-Expression "[EnvDTE.Constants]::$_.Name"

3 个答案:

答案 0 :(得分:3)

首先,过滤器离开(这里它可能没有太大变化,但它的好习惯):

[EnvDTE.Constants] | Get-Member -Static -MemberType Property -Name vsP*

你有MemberDefinition个对象:

| Foreach-Object { [EnvDTE.Constants]::"$($_.Name)" }

如果您在那里使用子表达式,那么您的最后一次尝试是可行的(尽管我建议不要使用它,但只有在必要时才应使用Invoke-Expression。)

答案 1 :(得分:1)

您可以使用.NET BCL路线:

[EnvDTE.Constants].UnderlyingSystemType.GetFields('Static,Public').Where({$_.Name -match 'vsP*'}).Foreach({$_.Name + " = " + $_.GetValue($null)})

或许还有一点PowerShelly:

[EnvDTE.Constants].UnderlyingSystemType.GetFields('Static,Public') | 
    Where Name -match vsP* | Foreach {$_.Name + " = " + $_.GetValue($null)}

或者:

[EnvDTE.Constants] | gm -static -MemberType Property -Name vsP* | 
    Foreach { invoke-expression "'$($_.Name) = ' + [$($_.TypeName)]::$($_.Name)" }

答案 2 :(得分:0)

您提供的第一个示例是正确的,但似乎不适用于该命名空间。这两项工作都是:

[system.math] | Get-Member
[system.net.webrequest] | Get-Member

如果您有dll文件,可以load it manually