如何在PowerShell静态类方法中获取当前类名/对象?

6

我需要$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()

笔误:不可用 - Anton Krouglov
2
这在技术上是这个问题的副本:https://dev59.com/Y3I95IYBdhLWcg3w3yFU。在C#中,像你所要求的那样(对于静态方法)做起来和PowerShell一样混乱。 - Chris Dent
@Chris Dent: [System.Reflection.MethodBase]::GetCurrentMethod().DeclaringType 似乎无法正常工作。 GetCurrentMethod() 的属性表明该方法是动态的。但是在 C# 中,您可以从 DoSomething 调用 DoAnything 而不需要完整引用,即 static void DoSomething() { DoAnything(); }。这正是我在 PowerShell 中所缺少的。 - Anton Krouglov
说得不错,但是我怀疑你很难找到比[foo]::DoAnything()更好的方法,因为单标签语句首先被执行为函数调用。这样做的唯一明显方法就是获取类型(GetCurrentMethod()),但它并没有包含一个类型。在引用PS类上的字段时,同样的问题存在(必须使用$ this变量)。 - Chris Dent
1个回答

1

静态类没有this指针。请参见MSDN

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

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


1
感谢您的及时回复,Pawel。但显然您的建议并没有解决问题。正如我在问题中所指出的,至少有一个解决方法$static_this = [foo]。只是在寻找更好的解决方案。 - Anton Krouglov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接