How can I call explicitly implemented interface method from PowerShell?

。_饼干妹妹 提交于 2019-12-29 07:39:07

问题


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


回答1:


Bad news: It's a bug.

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




回答2:


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.




回答3:


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



来源:https://stackoverflow.com/questions/746014/how-can-i-call-explicitly-implemented-interface-method-from-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!