如何从PowerShell调用显式实现的接口方法?

时间:2009-04-14 01:35:16

标签: powershell casting explicit-interface

代码:

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.

错误:

  

方法调用失败,因为[Bar]   不包含名为'Foo'的方法。

3 个答案:

答案 0 :(得分:4)

我为PowerShell v2.0编写了一些东西,可以很容易地以自然方式调用显式接口:

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

请参阅:

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

它通过生成一个动态模块来触发对接口的调用来实现这一点。解决方案是纯PowerShell脚本(没有讨厌的添加类型技巧)。

-Oisin

答案 1 :(得分:4)

您可以执行类似

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

您从IFoo对象获取Type成员的反射代表,并调用Invoke overload。但是太糟糕了,必须这样做。 明确实现属性的类似方法等。

如果方法接受参数,当然,它们会在上面代码中的逗号之后进入数组@()

答案 2 :(得分:3)