Как я могу вызвать явно реализованный метод интерфейса из PowerShell? - PullRequest
6 голосов
/ 14 апреля 2009

Код:

add-type @"
    public interface IFoo
    {
        void Foo();
    }

    public class Bar : IFoo
    {
        void IFoo.Foo()
        {
        }
    }
"@ -Language Csharp

$bar = New-Object Bar
($bar -as [IFoo]).Foo() # ERROR.

Ошибка:

Ошибка вызова метода, потому что [Bar] не содержит метод с именем 'Foo'.

Ответы [ 3 ]

4 голосов
/ 17 апреля 2009

Я написал кое-что для PowerShell v2.0, которое позволяет легко вызывать явные интерфейсы естественным образом:

PS> $foo = get-interface $bar ([ifoo])
PS> $foo.Foo()

См:

http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx

Это делается путем генерации динамического модуля, который преобразует вызовы в интерфейс. Решение в чистом скрипте PowerShell (без неприятных трюков с надстройками).

-Oisin

4 голосов
/ 08 октября 2013

Вы можете сделать что-то вроде

$bar = New-Object Bar
[IFoo].GetMethod("Foo").Invoke($bar, @())

Вы получаете (представление отражение ) члена IFoo из объекта Type и вызываете перегрузку Invoke . Жаль, что так нужно делать. Аналогичный подход для явно реализованных свойств и т. Д.

Если метод принимает аргументы, они, конечно, идут в массиве @() после запятой в приведенном выше коде.

3 голосов
/ 14 апреля 2009
...