【问题标题】:How do you get the value dynamically of a static class' properties?如何动态获取静态类属性的值?
【发布时间】:2014-05-28 20:41:21
【问题描述】:

我想遍历一个静态类的属性。 [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"

【问题讨论】:

    标签: powershell


    【解决方案1】:

    首先,向左过滤(这里可能变化不大,但它的好习惯):

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

    一个你有MemberDefinition对象:

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

    如果你在那里使用子表达式,你的最后一次尝试会奏效(尽管我建议不要这样做,Invoke-Expression 应该只在真正需要时使用)。

    【讨论】:

    • 错字:看看我使用 int Foreach-Object 块的时间 - 我错过了类型名称中的“v”...现在已修复。
    【解决方案2】:

    你可以走 .NET BCL 路线:

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

    或者更强大一点:

    [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)" }
    

    【讨论】:

      【解决方案3】:

      您给出的第一个示例是正确的,但似乎不适用于该命名空间。这两种方法都有效:

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

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

      【讨论】:

      • 命名空间的工作方式与[System.math] | get-member -static | where-object {$_.MemberType -eq "Property"} 相同,似乎不起作用的是能够访问以这种方式执行它们而返回的值,而无需返回并输入名称
      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多