如何在静态PowerShell类中使用委托?

时间:2018-05-16 23:06:02

标签: powershell class reflection delegates

  

我想在我的静态PowerShell 5.0类中使用func委托:

我遇到了一些问题,无法找到为我的委托分配其他静态类方法的方法。

此代码有效,但不太方便。

这里有更好的方法来使用委托吗?

我需要实现我的静态! class,只是为了获得类型。

我尝试了outcommented行,你将如何使用.NET类型,但它不适用于我自己的类。

如何让我的静态类的类型更优雅?

并且,BTW,GetMethod()没有加入BindingFlags参数,为什么?

class Demo
{
    hidden static [object] Method_1([string] $myString)
    {
        Write-Host "Method_1: $myString"
        return "something"    
    }

    hidden static [object] Method_2([string] $myString)
    {
        Write-Host "Method_2: $myString"    
        return $null    
    }

    hidden static [object] TheWrapper([string]$wrappedMethod, [string] $parameter)
    {
        # do a lot of other stuff here... 

        #return [System.Type]::GetType("Demo").GetMethod($wrappedMethod).CreateDelegate([Func``2[string, object]]).Invoke($parameter)
        return [Demo]::new().GetType().GetMethod($wrappedMethod).CreateDelegate([Func``2[string, object]]).Invoke($parameter)    
    }

    static DoWork()
    {
        Write-Host ([Demo]::TheWrapper('Method_1', 'MyMessage'))
        [Demo]::TheWrapper('Method_2', 'c:\my_file.txt')
    }
}

[Demo]::DoWork()

1 个答案:

答案 0 :(得分:1)

您不需要创建[demo]的实例,因为[demo]是该类的实际类型。此外,您可以将委托类型更简单地编写为[Func[string,object]]。这简化了TheWrapper方法的主体

return [Demo].GetMethod($wrappedMethod).CreateDelegate([Func[string, object]]).Invoke($parameter)

但是在PowerShell中执行此操作的一种更简单的方法是通过将其名称传递给“。”来获取方法。运算符然后调用结果:

return [demo]::$wrappedMethod.Invoke($parameter)

在PowerShell中,'。'的右侧。运算符不需要是常量。您可以使用一个表达式来生成要检索的方法(或属性)的名称。