2016-07-14 20 views
2

Ich habe den folgenden Code (ein einfaches Beispiel für ein komplexeres Projekt), wo ich eine statische "Master" -Liste von Objekt-typisierten Listen habe.Statische Liste innerhalb einer generischen Klasse

Wenn Sie durch den Code gehen, erwartete ich, dass, wenn der zweite referenzManager3-Typ über den Konstruktor erstellt wird, die _masterList dann sowohl die String- als auch die Objektliste enthält. Allerdings nicht.

Ich nehme an, dies liegt daran, dass jede Instanz von ReferenceManager3 aufgrund der generischen Typdefinition tatsächlich unterschiedliche Klassentypen sind. Habe ich Recht, das zu denken?

Wie kann ich das schaffen?

class Program 
{ 
    static void Main(string[] args) 
    { 
     ReferenceManager3<string> StringManager = new ReferenceManager3<string>(); 
     ReferenceManager3<object> IntManager = new ReferenceManager3<object>(); 
    } 
} 

class ReferenceManager3<T> where T : class //IReferenceTracking 
{ 
    // Static list containing a reference to all Typed Lists 
    static List<IList> _masterList = new List<IList>(); 

    // Object Typed List 
    private List<T> _list = null; 

    public ReferenceManager3() 
    { 
     // Create the new Typed List 
     _list = new List<T>(); 

     // Add it to the Static Master List 
     _masterList.Add(_list); // <<< break here on the second call. 
    } 
} 
+1

Aus Interesse, warum ist das etwas, was Sie tun möchten? Ich denke, es könnte eine bessere Alternative geben, wenn Sie einen Kontext bereitstellen können. – TheInnerLight

+1

Ein Workaround wäre, die '_masterlist' in einer anderen Klasse zu platzieren. –

+1

@TheGrovesy Sie haben klar angenommen, dass _masterList für beide Objekte die gleiche Instanz gewesen wäre, jedoch wird es verschiedene statische Objekte für verschiedene Instanzen Ihrer generischen Klasse geben. Was willst du erreichen? – Phate01

Antwort

5

Sie können generische Klasse von einer nicht-generic (Zusammenfassung) Basisklasse ableiten:

abstract class ReferenceManager3 
{ 
    // Static list containing a reference to all Typed Lists 
    protected static List<IList> _masterList = new List<IList>(); 
} 

class ReferenceManager3<T> : ReferenceManager3 where T : class //IReferenceTracking 
{ 

    // Object Typed List 
    private List<T> _list = null; 

    public ReferenceManager3() 
    { 
     // Create the new Typed List 
     _list = new List<T>(); 

     // Add it to the Static Master List 
     _masterList.Add(_list); // <<< break here on the second call. 
    } 
} 
+0

Ich war so nah. Das funktioniert großartig. – TheGrovesy

+1

Was ist der Unterschied, warum funktioniert das .. –

+0

Ich dachte, abstrakte Klasse sollte mindestens eine abstrakte Methode benötigen: 3 – Sherlock

0

Ja, Ihre Annahme richtig ist, ReferenceManager3<string> und ReferenceManager3<object> verschiedenen Klassen sind, die haben nichts in verbreitet. Also haben beide Klassen auch eigene (statische) Listen.

Sie können jedoch eine nicht-generische abstrakte Klasse erstellen, die die statische Liste enthält. Jetzt implementieren Sie einfach diese Klasse von Ihrem generischen wie Fratyx bereits erwähnt.