2009-04-14 23 views
6

code:Comment puis-je appeler une méthode d'interface explicitement implémentée à partir 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. 

Erreur:

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

+0

L'implémentation implicite fonctionne-t-elle? – Kredns

+0

@Lucas. Oui cela fonctionne. – alex2k8

+0

@ alex2k8: Wow c'est incroyable, je ne vois pas pourquoi MS ne permettrait pas une implémentation explicite? Peut-être qu'il y a une option que vous n'utilisez pas, je vais m'y pencher. – Kredns

Répondre

3
+0

J'ai un compte Microsoft Live, mais ne peut toujours pas ouvrir le lien: Page introuvable. :-( – alex2k8

+0

Il a ouvert sur le mien, mais seulement dans IE 8, Firefox et google chrome ne fonctionnait pas – Kredns

+0

J'ai essayé IE7, Fx, Opera - pas de chance.Vous pouvez probablement coller quelque citate ici (si quelque chose d'utile) – alex2k8

4

j'ai écrit quelque chose pour v2.0 PowerShell qui le rend facile d'appeler des interfaces explicites de façon naturelle:

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

Voir:

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

Il le fait en générant un module dynamique qui réduit les appels à l'interface. La solution est dans un script PowerShell pur (pas d'astuces add-type).

-Oisin

+0

Merci, Oisin! J'ai ajouté une réponse basée sur votre solution ici http://stackoverflow.com/questions/745956/how-can-i-dispose-system-xml-xmlwriter-in-powershell/767661#767661 – alex2k8

4

Vous pouvez faire quelque chose comme

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

Vous obtenez (la réflexion representaion de) membre de IFoo de l'objet Type et appeler un Invoke overload. Dommage que l'on doive le faire de cette façon, cependant. Approche similaire pour les propriétés explicitement implémentées, etc.

Si la méthode prend des arguments, ils vont dans le tableau @() après la virgule dans le code ci-dessus, bien sûr.