2011-01-11 24 views
9
public static class MyClass 
{ 
    public static void Add<T>(this List<T> list, T item) 
    { 
     list.Add(item); 
     Console.WriteLine(item.ToString()); 
    } 
} 

dannWie ein Mitglied Verfahren durch eine Erweiterungsmethode

List<string> list = new List<string>(){"1","2"}; 
list.Add("3"); 

Aber die Member-Methode genannt würde zu verbergen.

Gibt es auf jeden Fall meine Extension Method auf diese Weise anrufen?

Ich will nicht, es so nennen:

MyClass.Add(list, item) 
+1

Selbst wenn 'list.Add (" 3 ")' 'List.Add' überschrieben und Ihre Erweiterungsmethode aufgerufen wurde, sollten Sie erwarten, dass' list.Add (item) 'dasselbe tut, was zu einer unendlichen Rekursion führt. – Kobi

+0

Ich sehe, meine Frage ist nur eine Frage der Neugier und ich gebe einen Beispielcode, nur um zu zeigen, was ich will, dennoch haben Sie Recht –

Antwort

8

Sie können nicht. Instanzmethoden immer haben Vorrang vor Erweiterungsmethoden, vorausgesetzt, sie sind anwendbar. Die Mitgliederauflösung berücksichtigt nur Erweiterungsmethoden, wenn keine Option für eine Nicht-Erweiterungsmethode gefunden wurde.

Ich würde vorschlagen, dass Sie einfach Ihre Methode umbenennen - es sei denn, der Punkt war, diese Methode transparent mit vorhandenem Code aufzurufen.

Wenn Sie es ein IList<T> statt List<T> nehmen gemacht, könnten Sie einen Wrapper erstellen, die IList<T> und die Delegierten alle Anrufe auf die gewickelte Liste implementiert, die Durchführung keine zusätzliche Aufgaben, wie Sie gehen. Sie könnten dann auch schreiben eine Erweiterungsmethode zu IList<T>, die den Wrapper erstellt - die in einigen Fällen für flüssigere Syntax ermöglichen würde. Persönlich bevorzuge ich den Wrapper-Ansatz, um einen neuen Sammlungstyp abzuleiten, da dies bedeutet, dass Sie ihn mit Ihren vorhandenen Sammlungen verwenden können, wodurch der Code möglicherweise kleiner wird ... aber alles hängt davon ab, was Sie tun möchten.

+1

Dekorateur macht Sinn –

7

Instanzmethoden immer hat Vorrang vor Erweiterungsmethoden, also nein.

Die richtige, was hier zu tun erscheinen würde Polymorphismus sein - aber beachten Sie, dass List<T> nicht virtual Methoden bietet. Collection<T> tut, aber:

using System; 
using System.Collections.ObjectModel; 
class MyClass<T> : Collection<T> { 
    protected override void InsertItem(int index, T item) { 
     base.InsertItem(index, item); 
     Console.WriteLine("Added:" + item.ToString()); 
    } 
    protected override void SetItem(int index, T item) { 
     base.SetItem(index, item); 
     Console.WriteLine("Set (indexer):" + item.ToString()); 
    } 
    // see also ClearItems and RemoveItem 
} 
+2

Ploymorphismus - ist das eine hinterhältige Überlastung? ;) –

+0

@Mitch - nett; p Korrigiert. –

+0

aber Überladung wird auch "Ad-hoc-Polymorphismus" genannt, nichts falsch daran –

Verwandte Themen