【问题标题】:Set static property on static class in PowerShell在 PowerShell 中的静态类上设置静态属性
【发布时间】:2020-09-19 21:47:29
【问题描述】:

我有一个类,该类有属性,但我只想能够在内部设置它们的值,但允许对其进行公共 get 访问器。由于在 C# 中这样的类中没有 PS 等效项:

public string PropertyName {
   get;
   private set;
}

我已经研究过在我的类上实现以下解决方法,以便“私有”成员通过属性的公共访问器保持隐藏:

class MyClass {
  hidden [string]$_PropertyName
  
  MyClass( $propertyValue ) {
    $this._PropertyName = $PropertyValue
    $this | Add-Member -ScriptProperty -Name 'PropertyName' -Value {
      return $this.$_PropertyName
    } -SecondValue {
      throw "Cannot write value to a readonly property"
    }
  }
}

这很好用,可以做我想做的事,但是这个类也有几个静态属性,我想从它的静态构造函数中做同样的事情。虽然上面的代码确实适用于设置类类型本身的属性(用[MyClass] 替换$this),但有一个小怪癖使访问“只读”属性的语法不一致正常访问静态成员:

hidden static [string]$_StaticProperty = 'someValue'

static MyClass() {
  [MyClass] | Add-Member -ScriptProperty StaticProperty -Value {
    return [MyClass]::$_StaticProperty
  }
}

我可以访问StaticProperty,但只能作为实例成员:

[MyClass]::StaticProperty # ==> $null
[MyClass].StaticProperty # ==> someValue

有没有办法使用 Add-Memberstatic 成员添加到类型中,这样我就可以保持访问器语法一致?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    有没有办法使用 Add-Member 向类型添加静态成员,以便保持访问器语法一致?

    没有

    Add-Member 旨在允许用户将合成 ETS 属性添加到 instance 对象 - 早在有人考虑将 class 关键字添加到语言语法之前。

    换句话说,“静态成员”在 ETS 上下文中的含义为零,因为 ETS 成员与已实例化对象的身份相关联。

    如果您想要 C# 中的类成员行为,请使用 C#:

    Add-Type @'
    public class MyClass
    {
      static MyClass()
      {
        MyClass.StaticProperty = "some value";
      }
    
      public static string StaticProperty { get; private set; }
    }
    '@
    
    # Use [MyClass]::StaticProperty
    

    【讨论】:

    • 感谢您的回答。我一直在尝试将 PowerShell 类而不是 PSCustomObjects 用于某些事情,因为适当的类对我正在做的一些工作有意义,但是当其他 .NET 语言携带其全套时,发现 PS 类有多么有限是令人沮丧的的特征。开始认为我应该开始用 C# 编写类,因为 PS 类基本上就像在实践中定义 structs
    • @BendertheGreatest 不确定structs 是否是正确的类比(PowerShell 类是真正的引用类型),但最大的问题是您要实现什么?您问题中的示例非常通用,但我怀疑您可以用模块范围的只读变量替换现实生活中的静态属性
    • 这个例子更多的是在 PowerShell 中使用类来避免在生产代码中使用 Add-Type 编译 C# 代码,看看可以用它们做什么,不能做什么。如果您只需要设置一次值,则只读属性有效,但如果对象必须稍后更改,则无效。一种方法有效,但为什么要使用属性呢?这也显示了您必须做些什么来控制 getter/setter 通常所做的事情。 is interest 在定义 getter/setter 行为,所以我认为我不希望 PS 支持这一点。
    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多