Como posso chamar explicitamente implementado método de interface do PowerShell?
-
09-09-2019 - |
Pergunta
Código:
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.
Erro:
Método invocação falhou porque [Bar] não contém um método chamado 'Foo'.
Solução
Más notícias:. É um bug
https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=249840&SiteID=99
Outras dicas
Eu escrevi algo para PowerShell v2.0 que torna mais fácil para chamar as interfaces explícitas de uma forma natural:
PS> $foo = get-interface $bar ([ifoo])
PS> $foo.Foo()
Veja:
http://www.nivot.org/2009/03/28 /PowerShell20CTP3ModulesInPracticeClosures.aspx
Ele faz isso através da geração de um módulo dinâmico que thunks chamadas para a interface. A solução está no script do PowerShell puro (não do tipo add desagradáveis ??truques).
-Oisin
Você pode fazer algo como
$bar = New-Object Bar
[IFoo].GetMethod("Foo").Invoke($bar, @())
Você começa (o reflexão representaion de) o membro do IFoo
do objeto Type
e ligar para um Invoke
sobrecarga . Pena que um tem que fazê-lo dessa forma, embora.
abordagem semelhante para propriedades explicitamente implementados etc.
Se o método leva argumentos, eles vão na @()
matriz após a vírgula no código acima, é claro.