2012-04-04 3 views
0

В File1 я создал класс с 3 строками. Я создал еще один класс с публичным arraylist. Я хочу, чтобы этот arraylist был динамическим, а объект, который он содержит, - это класс с 3 строками. Я могу получить доступ к членам класса в файле, но не в отдельном файле.Как сделать arraylist общедоступным

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)); 

Так что я могу заполнить массив классов, но не может получить доступ к нему в отдельном файле. Файл 2

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

Ваш код не может быть скомпилирован. Ваш конструктор - 'DetectorCollection', но ваш класс' SensorCollection'. –

+0

Являются ли файлы в том же пространстве имен? –

+2

Вы используете .net 1.x или почему вы используете 'ArrayList' вместо' List '? – CodesInChaos

ответ

2

Если вы создаете SensorCollectionArray вроде этого:

SensorCollectionArray mySCA = new SensorCollectionArray(); 

Тогда вы можете получить доступ к его ArrayList, как это (например, добавить элемент):

mySCA.SensorArrayList.Add(mySensorCollection); 

Обратите внимание, однако, что в коде, который вы опубликовали, вы не включили конструктор для SensorCollectionArray, поэтому SensorArrayList будет иметь значение null после создания экземпляра. Таким образом, вы можете либо установить его в отдельно созданный ArrayList, либо создать ArrayList в своем классе SensorCollectionArray.

Конечная нота: Вы можете посмотреть в общий список (Т) класса, если вы хотите создать строго типизированных коллекции

+2

Я бы сказал, что он должен * определенно * изучить использование дженериков. Существует не настоящая причина использовать 'ArrayList', если вы используете .NET 2 или новее. –

0

Не совсем уверен, О чем пытается сделать, но я предполагаю, что это что-то вроде нижеприведенное. Предположительно, вы создаете коллекцию своих датчиков, потому что вы хотите применить некоторые правила до их хранения в коллекции.

«Является ли это хорошим датчиком? Это? Добавьте его в коллекцию!»

В противном случае, вы могли бы просто использовать

List<Sensor> mySensors; 

и на самом деле не использовать класс, который будет по сути делает то же самое. Помимо этого, как уже упоминалось, на самом деле нет причины использовать ArrayList. Как указывает Марк, наиболее убедительной причиной использования ArrayList является you're using .NET 1.1; в противном случае вы должны использовать общую коллекцию списков и все, что она делает для вас.

//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); 
    } 
} 

Редактировать

Как получить доступ к IPAddress каждого датчика в моей динамически созданный список классов?

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); 

Я не могу получить доступ к членам класса в другом файле

Убедитесь, что они находятся в том же пространстве имен, или что вы включают в себя «используя» заявление который включает пространство имен ваших классов, которые вы создаете.

+0

Спасибо за ваши ответы. У меня есть переменное количество датчиков. Я динамически создаю суб-вкладки для каждого датчика. Я хочу иметь класс, который будет содержать три члена строки (ipaddr, portnum, loc). Эти члены заполняются через .ini-файл. Участникам необходимо получить доступ в других файлах, и именно там меня повесили. Как получить доступ к ipaddress каждого датчика в динамически создаваемом списке классов? – user1313577

+0

Позвольте мне уточнить мой предыдущий пост. Я хочу динамический массив класса датчика. В первом файле я смог получить доступ к каждому члену, используя это: (SensorArrayList [0] как SensorDataCollection) .ipAddress, но я не могу получить доступ к членам класса в другом файле. SensorArrayList [i] – user1313577

+0

Я немного отредактировал свой ответ. Посмотрите, поможет ли это. Конечно, есть несколько способов, которыми вы могли бы заниматься своими конкретными целями (например, создание собственной пользовательской коллекции, реализующей IList, или просто использование списка и вообще не использование собственного класса коллекции), поэтому вы можете рассмотреть эти альтернативы. – Jesse

Смежные вопросы