2009-04-14 11 views
6

Código:¿Cómo puedo llamar al método de interfaz explícitamente implementado de 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. 

error:

Method invocation failed because [Bar] doesn't contain a method named 'Foo'.

+0

¿Funciona la implementación implícita? – Kredns

+0

@Lucas. Si, funciona. – alex2k8

+0

@ alex2k8: Wow, eso es increíble, no veo por qué MS no permitiría la implementación explícita. Tal vez haya una opción que no uses, la investigaré. – Kredns

Respuesta

4

escribí algo para PowerShell v2.0 que hace que sea fácil llamar a las interfaces explícitas de una manera natural:

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

Ver:

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

Se lo hace al generar un módulo dinámico que envía llamadas a la interfaz. La solución está en la secuencia de comandos pura de PowerShell (sin trucos de tipo desagradable).

-Oisin

+0

Gracias, Oisin! Agregué una respuesta basada en su solución aquí http://stackoverflow.com/questions/745956/how-can-i-dispose-system-xml-xmlwriter-in-powershell/767661#767661 – alex2k8

4

Usted puede hacer algo como

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

Se obtiene (la reflexión REPRESENTACIÓN de) el miembro de IFoo del objeto Type y llamar a un Invoke overload. Lástima que uno tiene que hacerlo de esa manera, sin embargo. Aproximación similar para las propiedades explícitamente implementadas, etc.

Si el método toma argumentos, van en la matriz @() después de la coma en el código anterior, por supuesto.

Cuestiones relacionadas