如何在PowerShell中创建私有类成员?

Avi*_*iho 4 powershell class powershell-5.0

我发现 powershell 有类,我正在尝试使用私有类成员。我知道有隐藏的类成员,但我需要在我的项目中使用 private。如何在 PowerShell 中创建私有类成员?

mkl*_*nt0 7

无法在 PowerShell (v5+)自定义类中创建私有成员

隐藏成员(用关键字声明hidden)是最接近的近似值

成员hidden

  • 当您使用 ; 检查类的实例时,默认情况下不会Get-Member列出。使用
    -Force开关来包含它们。

  • 当您使用制表符完成时,不会自动完成。

  • 默认输出格式中不显示

  • 当您通过管道将实例传递给以下 cmdlet 时,不包括在内:

    • Select-Object: using-Property *仅选择所有非隐藏属性,隐藏属性通常无法与通配符表达式匹配- 尽管您可以通过其完整的文字名称来选择它们。

    • ConvertTo-Csv,Export-Csv

    • ConvertTo-Xml(几乎没有使用过)

但是,如果您直接访问隐藏成员,则仍然可以公开访问它们

隐藏属性包含在以下 cmdlet 的输出中:

  • Export-CliXml:考虑到此 cmdlet 的目的是创建其输入对象的尽可能忠实的序列化表示,这是有道理的。

  • (从 PowerShell Core 7.0.0-preview.5 开始)ConvertTo-Json:这是令人惊讶的,因为Select-Object、 和ConvertTo-Csv/Export-Csv和 的ConvertTo-Xml行为不同。

    • 请参阅此 GitHub 问题

    • 作为解决方法,您可以首先通过管道传递到Select-Object -Property *,这会隐​​式排除隐藏属性。


示例代码

# Define class Foo with one hidden and one public property...
class Foo { hidden [string] $HiddenProp = 'hide me'; [string] $PublicProp = 'show me' }
# ... and create an instance stored in variable $foo.
$foo = [Foo]::new()
Run Code Online (Sandbox Code Playgroud)
# Default formatting does *not* show .HiddenProp
# Similarly, typing $foo.Hi<tab> would *not* tab-complete to $foo.HiddenProp
PS> $foo

PublicProp
----------
show me
Run Code Online (Sandbox Code Playgroud)
# However, if you refer to .HiddenProp directly,
# you can retrieve (or set) its value.
PS> $foo.HiddenProp
hide me
Run Code Online (Sandbox Code Playgroud)
# .HiddenProp is not shown by default.
# Add -Force to include it.
PS> $foo | Get-Member -Type Properties


   TypeName: Foo

Name       MemberType Definition
----       ---------- ----------
PublicProp Property   string PublicProp {get;set;}
Run Code Online (Sandbox Code Playgroud)
# .HiddenProp is not matched by the wildcard expression.
# Pass it in full, literally to force inclusion (Select-Object *, HiddenProp)
PS> $foo | Select-Object *Prop
Run Code Online (Sandbox Code Playgroud)
# .HiddenProp is not serialized.
# You cannot force its inclusion.
# Ditto for Export-Csv
PS> $foo | ConvertTo-Csv
"PublicProp"
"show me"
Run Code Online (Sandbox Code Playgroud)
# As of PowerShell Core 7.0.0-preview.5:
# .HiddenProp IS unexpectedly serialized.
# You cannot force its *ex*clusion, except via
# an aux. `Select-Object *` call inserted before `ConvertTo-Json`
PS> $foo | ConvertTo-Json
{
  "HiddenProp": "hide me",
  "PublicProp": "show me"
}
Run Code Online (Sandbox Code Playgroud)