Как я могу вызвать явно реализованный метод интерфейса из PowerShell?
-
09-09-2019 - |
Вопрос
Код:
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».
Решение
Плохие новости:Это ошибка.
https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=249840&SiteID=99
Другие советы
Я написал кое-что для 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
перегрузка.Но очень жаль, что приходится поступать таким образом.Аналогичный подход для явно реализованных свойств и т. д.
Если метод принимает аргументы, они помещаются в массив @()
после запятой в приведенном выше коде, конечно.