8

代码:

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”的方法。

4

3 回答 3

6

你可以做类似的事情

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

您从对象中获取(的反射表示)成员并调用重载。太糟糕了,但必须这样做。显式实现的属性等的类似方法。IFooTypeInvoke

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

于 2013-10-08T14:36:47.133 回答
5

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

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

看:

http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx(存档在这里)。

它通过生成一个动态模块来实现对接口的调用。解决方案是纯 powershell 脚本(没有讨厌的 add-type 技巧)。

-Oisin

于 2009-04-17T17:17:38.797 回答
2

坏消息:这是一个错误。

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

于 2009-04-14T02:29:17.477 回答