代码:
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'的方法。
答案 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)