Как использовать делегаты внутри статического класса PowerShell? - PullRequest
0 голосов
/ 17 мая 2018

Я хочу использовать делегат func в моем статическом классе PowerShell 5.0:

У меня были проблемы с поиском способа назначить другие методы статического класса для моего делегата.

Этот код работает, но не очень удобно.

Есть ли лучший способ использовать делегата здесь?

И мне нужно создать свою статику! класс, только чтобы получить тип.

Я попробовал закомментированную строку, как бы вы делали это с типами .NET, но она не работает для моего собственного класса.

Как мне сделать тип моего статического класса здесь более элегантным?

И, кстати, 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 голосов
/ 17 мая 2018

Вам не нужно создавать экземпляр [demo], поскольку [demo] является фактическим типом класса.Кроме того, вы можете написать тип делегата более просто как [Func[string,object]].Это упрощает тело метода TheWrapper до

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

, но гораздо более простой способ сделать это в PowerShell - получить метод путем передачи его имени в «.»оператор затем вызывает результат:

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

В PowerShell, правая часть '.'Оператор не должен быть константой.Вы можете использовать выражение, которое приводит к имени метода (или свойства) для извлечения.

...