2009-07-07 5 views
0

Ich habe ein großes Projekt, das ursprünglich in C# 1.1 geschrieben wurde und nun auf C# 2.0 abzielt. Es gibt mehrere Klassen, die Methoden haben, die einen ArrayList-Parameter nehmen, den ich starten möchte, um diese als Parameter zu übernehmen, aber das kann nicht auf einmal gemacht werden, also muss ich beide Parameter akzeptieren.Parameter von ArrayList in die Liste migrieren <T>

Mein Hauptgrund für die Migration ist, dass List<> Objekte als Parameter akzeptiert werden, aber ich möchte auch Typsicherheit nutzen.

Haben

als

1) Überlastungen erstellen und den Code zu duplizieren. Dies hat den Vorteil, dass ich den alten Code als veraltet markieren kann, aber offensichtlich ist der Duplizierungscode schlecht.

2) Ändern der Parameter IEnumerable: Dies hat den Vorteil, mit alten und neuen Code zu arbeiten, aber nicht typsicher, da es List<T1> zu akzeptieren, wo es List<T2>

3) Re- sein sollte Schreiben der Methoden, um einen List<T> Parameter zu nehmen und einen dünnen Wrapper zu schreiben, der einen ArrayList-Parameter übernimmt und die Elemente in ein neues List<T> kopiert und dann die Hauptmethode aufruft. Dies hat auch den Vorteil, dass ich den alten Stilcode als veraltet markieren kann. Es wird eine leichte Leistung/GC-Treffer haben.

4) Erstellen von drei Überladungen. Eine private Methode, die IEnumerable und zwei öffentliche Wrapper-Methoden (eine für ArrayList und eine für List<T>), die nur die private Methode aufrufen. Dies hat auch den Vorteil, dass ich den alten Code als veraltet markieren kann. Nicht sicher, ob es irgendwelche Nachteile außer drei Methoden hat.

Ich bin auf 4 gelehnt, aber übersehe ich irgendetwas?

Antwort

6

Verwenden Sie definitiv eine Variante von # 2, wo Sie für IEnumerable<T> statt List<T> schießen. Für diejenigen, die mehr als IEnumerable<T> benötigen, sollte Ihr Ziel IList<T> sein.

Für die Methoden, die nach IEnumerable<T> migrieren können, können Sie sie für kurze Zeit nur in IEnumerable verschieben und auf diese Weise vermeiden, zwei Kopien der Methode zu verwalten. Nachdem die meisten ArrayLists verschwunden sind, können Sie den Vorgang mit sehr wenig Aufwand auf IEnumerable<T> abschließen.

+0

Diese Antwort scheint die Stimmen zu bekommen, also denke ich, es ist der Gewinner. Hatte nicht mit IEnumerable anstatt Liste in Betracht gezogen, aber es wäre die bessere Option. Ich denke, ich werde Joels Rat für jetzt folgen. Vielleicht, wenn die nicht-generischen Methoden noch in ein paar Monaten verwendet werden, werde ich tun, was ShuggyCoUk vorschlägt, so dass der Compiler anfängt, sich zu beschweren. – sgmoore

0

Ich würde eine vollständige Suite von IEnumerable<t> (oder vielleicht IList<t>, wenn Sie Manipulation statt Aufzählungsfunktionen benötigen) Parameter Methoden erstellen und diese zu Ihren Standardmethoden, die die ganze Arbeit machen. Aus Gründen der Kompatibilität mit Ihrem ArrayList-Vertrag können Sie Ihre ursprünglichen ArrayList-Methoden dann in IEnumerable<t> übersetzen lassen und die Methoden IEnumerable aufrufen.

Grundsätzlich verschieben Sie die Arbeit zu Ihrer mehr typsicheren Option und erstellen Sie eine Fassade für Ihren alten Vertrag.

0

Ich würde Joels ausgezeichnete Antwort hinzufügen, dass Sie den Kopieraufwand vermeiden können, indem Sie in Ihrer Übergangsphase die vorhandene Methode als Ihre "echte" Methode verwenden und einfach von der IEnumerable<T> Überlastung auf die IEnumerable anrufen.

Dies wäre eine schnelle und einfache Änderung, mit fast keiner binären Inkompatibilität eingeführt.

Sie können die Methode IEnumerable mit [Obsolete("please move to the generic implementation", false)] markieren (die Warnung bei der anderen Überlast unterdrücken) und dann stetig zur "richtigen" Version wechseln.

Sobald dies erledigt ist, können Sie die echte Methode in eine, die sich auf die Typ-Safe-Generics verlässt, umwandeln und die Verkettung abbrechen.

Verwandte Themen