2010-11-10 31 views
7

我無法弄清楚如何讓Powershell在我的課堂上調用索引器。這個類看起來是這樣的(大大簡化):如何從PowerShell調用C#類的索引器?

public interface IIntCounters 
{ 
    int this[string counterName] { get; set; } 
} 

public class MyClass : IIntCounters 
{ 
    public IIntCounters Counters { get { return this; } } 

    int IIntCounters.this[string counterName] 
     { get { ...return something... } } 
} 

如果我新了這個班,我不能只使用括號運算符就可以了 - 我得到一個「無法索引」的錯誤。我也試過使用get_item(),這是Reflector向我展示了索引器最終成爲程序集,但是這讓我「不包含名爲get_item的方法」錯誤。

更新:這似乎特定於我使用顯式接口。所以我的新問題是:有沒有辦法讓Powershell在不切換顯式接口的情況下查看索引器? (我真的不希望修改此裝配如果可能的話)。

回答

4

這對我的作品(使用反射)。

$obj = new-object MyClass 
$p = [IIntCounters].GetProperty("Item") 
$p.GetValue($obj, @("counterName")) 
+0

是的!謝謝。 – scobi 2010-11-28 01:08:49

2

我沒有試過,但它看起來像它應該工作:

$obj = new-object MyClass 
$counters = [IIntCounters]$obj 
$counters['countername'] 

(OK,我打得四處一點,我不再認爲這是可能的工作,但它可能仍然是值得一試)

+0

是啊,這幾乎是一樣的$ obj.Counters ['countername'] ..不工作。 :( – scobi 2010-11-11 18:10:23

+2

我認爲它可能工作的原因是顯式實現的接口只能通過對接口的引用而不是通過對實現類的引用來訪問。不幸的是,當您將類引用強制轉換爲接口引用時,PowerShell仍然顯示作爲參考的最派生類 – OldFart 2010-11-11 18:53:25

+0

正確,但調用'Counters'會返回一個IIntCounters,它是對接口的引用,而不是類。你的觀點有趣的是,通過接口向類但是,如果它總是反映參考以找到下面的真實混凝土對象,那麼可以解釋這個問題。嗯..可以安裝新的方法來包裝明確的接口索引器.. – scobi 2010-11-12 18:26:23