2012-04-04 11 views
0

In File1 habe ich eine Klasse mit 3 Strings erstellt. Ich habe eine andere Klasse mit einer öffentlichen Arraylist erstellt. Ich möchte, dass diese Arraylist dynamisch ist und das Objekt, das sie enthält, die Klasse mit den 3 Saiten ist. Ich kann auf die Mitglieder der Klasse in der Datei, aber nicht in einer separaten Datei zugreifen.Wie mache ich eine Arraylist public

file1

public class SensorCollection 
    { 
     public string ipAddress; 
     public string portNumber; 
     public string physicalLocation; 

     public DetectorCollection(string ipAddr, string portNum, string loc) 
     { 
      this.ipAddress = ipAddr; 
      this.portNumber = portNum; 
      this.physicalLocation = loc; 

     } 
    } 
    public class SensorCollectionArray 
    { 
     public System.Collections.ArrayList SensorArrayList; 
    } 

... 
System.Collections.ArrayList DetectorArrayList = new System.Collections.ArrayList(); 
... 
    DetectorArrayList.Add(new DetectorCollection(ipAddress, portNum, str)); 

So kann ich das Array von Klassen füllen, aber kann es nicht in einer separaten Datei zugreifen. Datei 2

AdvancedSettingsForm.SensorCollectionArray mainDetectorCollectionArray; 
    System.Collections.ArrayList arrList; 
+3

Ihr Code kann nicht kompiliert werden. Ihr Konstruktor ist 'DetectorCollection', aber Ihre Klasse ist' SensorCollection'. –

+0

Sind die Dateien im selben Namespace? –

+2

Sind Sie auf .net 1.x oder warum verwenden Sie 'ArrayList' statt' List '? – CodesInChaos

Antwort

2

Wenn Sie eine SensorCollectionArray wie folgt zu erstellen:

SensorCollectionArray mySCA = new SensorCollectionArray(); 

Dann können Sie zugreifen, es Arraylist ist wie folgt (zum Beispiel ein Element hinzugefügt werden):

mySCA.SensorArrayList.Add(mySensorCollection); 

Beachten Sie jedoch, dass Sie im Code, den Sie gepostet haben, keinen Konstruktor für SensorCollectionArray eingefügt haben, sodass die SensorArrayList nach der Instanziierung null ist. Sie können also entweder eine separat instantiierte ArrayList festlegen oder die ArrayList innerhalb Ihrer SensorCollectionArray-Klasse erstellen.

Abschließender Hinweis: Sie können in die generische Liste aussehen soll (T) -Klasse, wenn Sie zu tun, um eine stark typisierte Sammlung

+2

Ich würde sagen, er sollte * definitiv * mit Generika arbeiten. Es gibt keinen zwingenden Grund, 'ArrayList' zu verwenden, wenn Sie .NET 2 oder höher verwenden. –

0

Nicht ganz sicher was machen versucht, erstellen möchten, aber ich nehme an, es ist etwas wie das untere. Vermutlich erstellen Sie eine Sammlung Ihrer Sensoren, weil Sie einige Regeln anwenden möchten, bevor Sie sie in der Sammlung speichern.

"Ist das ein guter Sensor? Es ist? Fügen Sie es der Sammlung hinzu!"

Andernfalls könnten Sie nur ein

List<Sensor> mySensors; 

verwenden und nicht wirklich eine Klasse verwenden, die im Wesentlichen die gleichen Dinge tun werden. Abgesehen davon, wie bereits erwähnt, gibt es keinen Grund, ArrayList zu verwenden. Wie Marc hier betont, ist der beste Grund, ArrayList zu verwenden, you're using .NET 1.1; Ansonsten sollten Sie die generische List-Sammlung und all die großartigen Dinge, die sie für Sie tut, verwenden.

//Sensor.cs 
public class Sensor 
{ 
    public string Ip{ get; set; } 
    public string Port{ get; set; } 
    public string PhysicalLocation{ get; set } 

    public Sensor(string ipAddr, string portNum, string loc) 
    { 
     Ip= ipAddr; 
     Port= portNum; 
     PhysicalLocation= loc; 
    } 
} 

//SensorCollection.cs 
public class SensorCollection 
{ 
    private List<Sensor> sensors; 

    public Sensor this[int i] 
    { 
     get { return this.sensors[i]; } 
     set { this.sensors[i] = value; } 
    } 

    public IEnumerable<Sensor> Sensors 
    { 
     get{ return this.sensors; } 
    } 

    public SensorCollection() 
    { 
     sensors = new List<Sensor>(); 
    } 

    public SensorCollection(string ip, string port, string location) : this() 
    { 
     this.sensors.Add(new Sensor(ip, port, location)); 
    } 

    public SensorCollection(Sensor sensor) : this() 
    { 
     this.sensors.Add(sensor); 
    } 

    public void AddSensor(Sensor sensor) 
    { 
     //Determine whether or not to add it 
     this.sensors.Add(sensor); 
    } 

    public void RemoveSensor(Sensor sensor) 
    { 
     if (sensors.Contains(sensor)) 
      sensors.Remove(sensor); 
    } 
} 

bearbeiten

Wie greife ich auf die IP-Adresse jeden Sensor in meiner dynamisch erstellt Liste der Klassen?

var mySensors = new SensorCollection(); 
mySensors.AddSensor(new Sensor("1.1.1.1", "123", "Home")); 
mySensors.AddSensor(new Sensor("9.9.9.9", "123", "Work")); 

foreach(Sensor s in mySensors.Sensors) 
    Console.WriteLine(s.Ip); 

Ich kann die Mitglieder der Klasse in einer anderen Datei

sicher, dass sie im gleichen Namensraum zu zugreifen scheinen, oder dass Sie ein „using“ Anweisung enthalten Dies umfasst den Namespace der von Ihnen erstellten Klassen.

+0

Vielen Dank für Ihre Antworten. Ich habe eine variable Anzahl von Sensoren. Ich erstelle dynamisch Unterreiter für jeden Sensor. Ich möchte eine Klasse haben, die die drei String-Mitglieder (ipaddr, portnum, loc) enthält. Diese Member werden über eine INI-Datei aufgefüllt. Auf die Mitglieder muss in anderen Dateien zugegriffen werden, und dort werde ich aufgehängt.E.g. Wie greife ich auf die IP-Adresse jedes Sensors in meiner dynamisch erstellten Klassenliste zu? – user1313577

+0

Lassen Sie mich meinen vorherigen Beitrag klären. Ich möchte ein dynamisches Array der Sensorklasse. In der ersten Datei konnte ich auf jedes Mitglied zugreifen, indem ich folgendes nutze: (SensorArrayList [0] als SensorDataCollection) .ipAddress, aber ich kann anscheinend nicht auf die Mitglieder der Klasse in einer anderen Datei zugreifen. SensorArrayList [i] – user1313577

+0

Ich habe meine Antwort ein wenig bearbeitet. Sehen Sie, ob das hilft. Zugegeben, es gibt verschiedene Möglichkeiten, wie Sie Ihre speziellen Ziele erreichen können (z. B. Erstellen einer eigenen benutzerdefinierten Sammlung, die IList implementiert oder einfach die Liste verwendet und keine benutzerdefinierte Erfassungsklasse verwendet), sodass Sie diese Alternativen in Betracht ziehen sollten. – Jesse