【问题标题】:How to get current class name/object inside PowerShell static class method?如何在 PowerShell 静态类方法中获取当前类名/对象?
【发布时间】:2016-08-20 15:35:07
【问题描述】:

我需要$this 在静态类中工作!如何做到这一点?任何解决方法?我在类上下文中分析了Get-PSCallStack 的返回值,发现没有任何用处。

我需要它来 (a) 记录和 (b) 调用同一类的其他静态方法,而无需一次又一次地提及其名称。

示例代码(PowerShell v5):

class foo {
    static [void]DoSomething() {
        [foo]::DoAnything()  #works

        #$this.DoAnything   #not working

        $static_this = [foo]
        $static_this::DoAnything() #works

    }
    static [void]DoAnything() {
        echo "Done"
    }
}

[foo]::DoSomething()

【问题讨论】:

  • 错字:不可用
  • 这在技术上是这个问题的副本:stackoverflow.com/questions/2113069/…。在 C# 中执行您所要求的(对于静态方法)与在 PowerShell 中一样混乱。
  • @Chris Dent:[System.Reflection.MethodBase]::GetCurrentMethod().DeclaringType 似乎不起作用。 GetCurrentMethod() 结果的属性表明该方法是动态的。无论如何,在 C# 中,您可以从 DoSomething 调用 DoAnything,而无需完整引用 static void DoSomething() { DoAnything(); }。正是我在 PowerShell 中缺少的。
  • 公平点,但我怀疑你会得到比[foo]::DoAnything() 更简洁的方法,因为单标签语句首先作为函数调用执行。那以及唯一可用于获取类型的明显方法 (GetCurrentMethod()) 不包含类型。引用 PS 类上的字段时也存在同样的问题(必须使用 $this 变量)。

标签: powershell reflection


【解决方案1】:

静态类没有this 指针。见MSDN

静态成员函数,因为它们存在于类级别而不是 作为对象的一部分,没有 this 指针。这是一个错误 在静态方法中引用 this。

你必须通过类名调用方法。

【讨论】:

  • 感谢 Pawel 的及时回复,但显然您的建议并不能解决问题。正如我在问题中指出的那样,至少有一种解决方法$static_this = [foo]。只是在寻找更好的。
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多