Как я могу вызвать явно реализованный метод интерфейса из PowerShell?

StackOverflow https://stackoverflow.com/questions/746014

Вопрос

Код:

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».

Это было полезно?

Решение

Другие советы

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

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

Видеть:

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

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

-Ойсин

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top