2009-04-14 91 views
6

代碼:如何從PowerShell調用顯式實現的接口方法?

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. 

錯誤:

Method invocation failed because [Bar] doesn't contain a method named 'Foo'.

+0

隱含的實現工作嗎? – Kredns 2009-04-14 02:04:28

+0

@Lucas。是的,它的工作原理。 – alex2k8 2009-04-14 02:08:41

+0

@ alex2k8:哇,這太神奇了,我看不出MS爲什麼不允許顯式實現?也許有一個選項,你不使用,我會研究它。 – Kredns 2009-04-14 02:17:38

回答

4

我寫的PowerShell 2.0的東西,可以很容易地調用明確的接口以自然的方式:

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

參見:

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

它通過生成一個可以調用接口的動態模塊來實現這一點。解決方案是在純PowerShell腳本(沒有討厭的添加類型的技巧)。

-Oisin

4

你可以做這樣的事情

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

你獲得(在反射表達中的)的IFooType對象的成員和撥打Invoke overload。然而,太糟糕了,必須這樣做。 明確實現的屬性的類似方法等。

如果該方法帶有參數,當然在上面的代碼中以逗號結尾後會出現在數組@()中。