Come posso chiamare in modo esplicito implementato metodo di interfaccia da PowerShell?
-
09-09-2019 - |
Domanda
Codice:
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.
Errore:
Method Invocation non è riuscito perché [Bar] non contiene un metodo chiamato 'Foo'.
Soluzione
Brutte notizie:. Si tratta di un bug
https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=249840&SiteID=99
Altri suggerimenti
Ho scritto qualcosa per PowerShell v2.0 che lo rende facile da chiamare interfacce esplicite in un modo naturale:
PS> $foo = get-interface $bar ([ifoo])
PS> $foo.Foo()
See:
http://www.nivot.org/2009/03/28 /PowerShell20CTP3ModulesInPracticeClosures.aspx
Lo fa generando un modulo dinamico che thunk chiamate all'interfaccia. La soluzione è nello script PowerShell puro (senza brutte aggiuntivo di tipo trucchi).
-Oisin
Si può fare qualcosa di simile
$bar = New-Object Bar
[IFoo].GetMethod("Foo").Invoke($bar, @())
Si ottiene ( riflessione representaion del) il membro del IFoo
dall'oggetto Type
e chiamare un sovraccarico Invoke
. Peccato che si deve fare in questo modo, però.
approccio simile per le proprietà in modo esplicito attuate ecc.
Se il metodo richiede argomenti, vanno nella @()
matrice dopo la virgola nel codice precedente, naturalmente.