2013-07-15 67 views
-1

我基本上要注入的擴展方法的ArrayList的每個副本,這會執行以下行爲:C#將擴展方法添加到類的實例?

ArrayList ourList = new ArrayList(); 
ourList.Add(randomarray or random arraylist); 

它會增加給定的陣列中,數組列表的內容或堆到「ourList」,而不是數組,數組,列表或堆棧本身。

不過,我的問題是:

如何注入的擴展方法只進了實例化類? 以下代碼將該方法添加到ArrayList基類和任何實例化副本,但是我希望它只在您訪問類的實例副本時可用。

public static void Add(this ArrayList ourlist){ 

    } 

    ArrayList.Add(); // Works, but shouldn't 
    ArrayList result = new ArrayList(); 
    result.Add(); // Works 

那麼,我該如何管理呢?

+0

什麼是*實例副本*應該是什麼? –

+0

總之,你不能。類型的所有方法和類型的所有擴展方法都適用於該類型的所有實例。 –

+0

我想你的意思是實例化? (!= NULL)? –

回答

10

如何將擴展方法注入到實例類中?

如果您正在討論將擴展方法添加到單個實例,則不能。 C#中沒有這樣的概念。擴展方法「擴展」了類型,而不是類型的單個實例。如果知識僅在執行時纔可用,您如何期望編譯器知道哪些實例在編譯時應用了擴展?

如果您正在討論像其他靜態方法一樣調用擴展方法,那麼總是是可行的,並且不能被阻止。所以,你可以隨時撥打:

MyExtensionClass.Add(null, null); 

如果你不談論任何的那些東西,目前還不清楚你的意思 - 但製作靜態調用ArrayList.Add如圖真的贏了」你的示例代碼編譯。你確定你沒有變量ArrayList? (這肯定會搞砸了。)

此外,由於ArrayList已經有一個Add(object)實例方法,您的新擴展方法永遠不會被使用。 (您應該儘可能快地遠離非通用集合。)

+1

'ArrayList.Add()'可以工作,如果靜態擴展類命名爲ArrayList,但有兩個參數'ArrayList.Add(list,value)' –

+1

@SriramSakthivel:在這一點'ArrayList result = new ArrayList();'wouldn沒有工作。類型名稱'ArrayList'只能表示特定上下文中的一種類型。 –

+0

是的,你是對的。如果它是ArrayList.Add(list,value);和System.Collections.ArrayList結果=新的System.Collections.ArrayList()假定沒有使用導入System.Collections導入 –