Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I call explicitly implemented interface method from PowerShell?

Code:

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'.

like image 794
alex2k8 Avatar asked Apr 14 '09 01:04

alex2k8


3 Answers

You can do something like

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

You get (the reflection representaion of) the member of IFoo from the Type object and call an Invoke overload. Too bad one has to do it that way, though. Similar approach for explicitly implemented properties etc.

If the method takes arguments, they go in the array @() after the comma in the code above, of course.

like image 152
Jeppe Stig Nielsen Avatar answered Oct 18 '22 08:10

Jeppe Stig Nielsen


I wrote something for PowerShell v2.0 that makes it easy to call explicit interfaces in a natural fashion:

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

See:

http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx (archived here).

It does this by generating a dynamic module that thunks calls to the interface. The solution is in pure powershell script (no nasty add-type tricks).

-Oisin

like image 37
x0n Avatar answered Oct 18 '22 07:10

x0n


Bad news: It's a bug.

https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=249840&SiteID=99

like image 27
Kredns Avatar answered Oct 18 '22 08:10

Kredns