2009-11-25 38 views
1

我只是學習C#,我現在有一個問題。 :-) 在C++中,我喜歡使用「const引用」作爲參數,以避免被調用的方法更改我傳遞的對象。C# - 是否有可能擴展一個新的接口現有的內置類

我在某處讀過我可以做的事情。通過使用接口在C#中類似。 在接口中,我只是放一些「getters」來允許該方法只讀取 到我的對象。

現在猜測,我想通過我的C#方法一個內置的容器,如「列表」。 但我想避免該方法改變該列表中的某些東西。 只需閱讀!

我的第一個想法是: - 我創建了一個名爲IMyOwnInterface新的接口,它使用接口的IList以及

  • 我的新界面IMyOwnInterface只包含「干將」

  • 我改變我方法。這樣MyLittleMethod(IMyOwnInterface如果)

  • 現在的方法「MyLittleMethod」纔可以看到的「干將」,我把我自己的接口和IList的

    的不是「二傳手」

這是可能? 有人可以給我一個提示嗎?

回答

1

是的,我相信會有效果。給它一個鏡頭,並讓我們知道它是如何工作的:d

0

答案是否定的:

IList中沒有實現IMyOwnInterface所以你不能施放它。

IList list = ... 
MyLittleMethod((IMyOwnInterface)list) // Compiler errror here 

在這種情況下,你可以使用ReadOnlycollection:

IList list = ... 
MyLittleMethod(new ReadOnlyCollection(list)) 
+0

我現在用的ReadOnlyCollection的名單,但詞典的情況下? 沒有ReadOnly ... for Dictionaries,對不對? – mrbamboo 2009-12-02 16:26:06

0

有了接口,它基本上只能通過繼承或與一些代理的東西(或者與適配器類明確,通過RealProxy實現,或有圖書館來做這種事情,比如林馥)。

但是,開箱即用,可以使用委託對具有匹配簽名的單個方法進行後期綁定。

+0

非常複雜,尤其對於初學者。 – 2009-11-25 18:29:06

3
+0

IList沒有AsReadOnly方法。 – 2009-11-25 18:27:57

+1

@Miriam:如果它是C#3中的IList ,那麼可以使用list.ToList()。AsReadOnly()。 – TrueWill 2009-11-25 19:05:05

+3

你總是可以做一個'IList readOnlyList = new ReadOnlyCollection (mutableList);'它爲原始列表創建一個訪問包裝(對原始列表的更改將反映在只讀列表中)。 – Lucero 2009-11-25 19:08:35

相關問題