По какой-то странной причине мой код вызывает ошибку ссылки на объект, когда я пытаюсь добавить в список, объявленный в моем классе. Свойство _machineName отображается. XML существует и имеет данные. Я уверен, что это имеет какое-то отношение к тому, как я создал экземпляры машин внутри метода. Какие-либо предложения? Я рисую пробел.
public class Machines
{
public List<string>_machineName { get; set; } //list I would like to add to
public Machines()
{}
public List<Machines> GetMachineList()
{
XmlDocument xml = new XmlDocument();
List<Machines> _machinesList = new List<Machines>();
List<string> str = new List<string>(); //List that works
string zdPath = GetZeroDeploymentPath();
zdPath = zdPath + @"\ZeroDeploymentService\XML\CatalogFile.xml";
using (XmlReader xmlReader = XmlReader.Create(zdPath))
{
xmlReader.MoveToContent();
while (xmlReader.Read())
{
if (xmlReader.IsStartElement())
{
switch (xmlReader.Name.ToLower())
{
case "machinename":
str.Add(xmlReader.ReadString().Trim()); //Works
_machineName.Add(xmlReader.ReadString().Trim()); //Fails
break;
}
}
}
}
return _machinesList;
}
Это потому, что вы никогда не создаете экземпляр списка. В конструкторе вашего класса "Машины" вам нужно добавить:
this._machineName = new List<string();
В стороне, общественная собственность не должна начинаться с подчеркивания.
Ваше имущество
public List<string>_machineName { get; set; }
позволяет вам получить доступ к _machineName, но вы фактически не создаете Список. Если вы добавите следующую строку в свой конструктор, она создаст экземпляр списка, после чего вы сможете добавить к нему.
_machineName = new List<string>;
Кстати, имя публичного имущества обычно является заглавной буквой, поэтому я бы изменил имя от _machineName до MachineName.
Исключение ObjectReferenceException будет вызываться при попытке действовать по ссылке вашего списка _machineName
до момента его создания, что происходит внутри вашей функции GetMachineList()
.
Вам придется перенести свой экземпляр этого объекта либо вне этого метода, либо в конструктор, либо в тело класса, или вам придется вызвать этот метод до вызова _machineName
_machineName
никогда не_machineName
.