2009-04-14 13 views
6

Codice:Come posso chiamare il metodo di interfaccia implementato esplicitamente da PowerShell?

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 failed because [Bar] doesn't contain a method named 'Foo'.

+0

L'implementazione implicita funziona? – Kredns

+0

@ Lucas. Sì funziona. – alex2k8

+0

@ alex2k8: Wow è incredibile, non riesco a capire perché MS non consenta l'implementazione esplicita? Forse c'è un'opzione che non stai usando, ci guarderò dentro. – Kredns

risposta

4

Ho scritto qualcosa per PowerShell v2.0 che lo rende facile da chiamare interfacce esplicite in maniera naturale:

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

See:

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

E ' ciò avviene generando un modulo dinamico che chiama l'interfaccia. La soluzione è in puro script PowerShell (niente brutti trucchi di tipo add-type).

-Oisin

+0

Grazie, Oisin! Ho aggiunto una risposta in base alla tua soluzione qui http://stackoverflow.com/questions/745956/how-can-i-dispose-system-xml-xmlwriter-in-powershell/767661#767661 – alex2k8

4

Si può fare qualcosa di simile

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

Si ottiene (il riflesso representaion del) il membro del IFoo dall'oggetto Type e chiamare un Invoke overload. Peccato che si debba fare così, però. Approccio simile per proprietà esplicitamente implementate, ecc.

Se il metodo accetta argomenti, essi vanno nell'array @() dopo la virgola nel codice sopra, ovviamente.

Problemi correlati