在PowerShell中的静态类上设置静态属性

在PowerShell中的静态类上设置静态属性,powershell,Powershell,我有一个类,其中类上有属性,但我只希望能够在内部设置它们的值,但允许对其使用公共get访问器。因为在C#中这样的类中没有PS等价物: 公共字符串属性名称{ 得到; 私人设置; } 我研究了在我的类上实现以下变通方法,以便“私有”成员通过属性的公共访问器保持隐藏状态: class-MyClass{ 隐藏的[字符串]$\u属性名称 MyClass($propertyValue){ $this.\u PropertyName=$PropertyValue $this | Add Member-Scr

我有一个类,其中类上有属性,但我只希望能够在内部设置它们的值,但允许对其使用公共get访问器。因为在C#中这样的类中没有PS等价物:

公共字符串属性名称{
得到;
私人设置;
}
我研究了在我的类上实现以下变通方法,以便“私有”成员通过属性的公共访问器保持隐藏状态:

class-MyClass{
隐藏的[字符串]$\u属性名称
MyClass($propertyValue){
$this.\u PropertyName=$PropertyValue
$this | Add Member-ScriptProperty-Name'PropertyName'-Value{
返回$this.$\u PropertyName
}-第二值{
抛出“无法将值写入只读属性”
}
}
}
这可以很好地工作并实现我想要的功能,但是这个类也有一些静态属性,我想从它的静态构造函数中为它们做同样的事情。虽然上面的代码确实可以在类类型本身上设置属性(用
[MyClass]
替换
$this
),但有一个小问题使得访问“readonly”属性的语法与通常访问静态成员的语法不一致:

hidden static[string]$\u StaticProperty='someValue'
静态MyClass(){
[MyClass]|添加成员-脚本属性StaticProperty-值{
返回[MyClass]:$\u StaticProperty
}
}
我可以访问
StaticProperty
,但只能将其视为实例成员:

[MyClass]::StaticProperty#==>$null
[MyClass].StaticProperty#==>someValue
是否有一种方法可以使用
addmember
将静态成员添加到类型中,以便保持访问器语法的一致性

有没有一种方法可以使用addmember将静态成员添加到类型中,以便保持访问器语法的一致性

addmember
旨在允许用户将合成ETS属性添加到实例对象中——这是在很久以前,还没有人考虑将
class
关键字添加到语言语法中

换句话说,“静态成员”在ETS上下文中没有任何意义,因为ETS成员与已实例化对象的标识相关联

如果希望类成员的行为与C#中的相同,请使用C#:


谢谢你的回答。我一直在尝试将PowerShell类用于某些事情,而不是使用
PSCustomObjects
,因为适当的类对于我正在做的一些工作来说是有意义的,但是当其他.NET语言具有其全部功能时,发现PS类是多么有限,这让人沮丧。我开始认为我应该开始用C语言编写类,因为PS类基本上只是想在实践中定义
structs
。@BenderSegreatest不确定
struct
s是否是正确的类比(PowerShell类是真正的引用类型),但大问题是你想实现什么?您问题中的示例非常通用,但我怀疑您可能能够在现实生活中用模块作用域的只读变量替换静态属性。此示例更像是PowerShell中的类的一种实践,以避免在生产代码中使用
Add Type
编译C#代码,看看他们能做什么,不能做什么。如果只需要设置一次值,但如果对象以后必须更改,则只读属性不起作用。方法可以工作,但为什么要使用属性呢?这还显示了控制getter/setter通常做什么。在定义getter/setter行为时有很多困难,所以我认为我不希望PS支持这一点。
Add-Type @'
public class MyClass
{
  static MyClass()
  {
    MyClass.StaticProperty = "some value";
  }

  public static string StaticProperty { get; private set; }
}
'@

# Use [MyClass]::StaticProperty