В C# рекурсивный метод возвращает значение null ссылка на объект не указывает на экземпляр объекта. Объекты XElement
Попытка рекурсивно добавить элементы XElements, проходя через список категорий.
XElement dataResponse = new XElement("Categories",
from c in db.Categories
where c.CatTypeID.Equals(catTypeID) && c.ParentID.Equals(null)
select new XElement("Category",
c.CatID == null ? null : new XAttribute("CatID", c.CatID),
c.ParentID == null ? null : new XAttribute("ParentID", c.ParentID),
c.CatTitle == null ? null : new XAttribute("CatTitle", c.CatTitle),
c.CatTypeID == null ? null : new XAttribute("CatTypeID", c.CatTypeID),
c.shortDesc == null ? null : new XAttribute("shortDesc", c.shortDesc),
c.longDesc == null ? null : new XAttribute("longDesc", c.longDesc),
c.CatImage == null ? null : new XAttribute("CatImage", c.CatImage)));
internalData = FillSubCatagories(dataResponse).ToString();
Вот первый список категорий теперь я хочу рекурсивно вытащить все подкатегории и вложить их в мой метод Xelements FillSubCatagories ():
private XElement FillSubCatagories(XElement cat) {
IEnumerable<XElement> list = cat.Descendants();
int catTypeID = c.Attribute("CatTypeID") == null ? 1 : Int32.Parse(cat.Attribute("CatTypeID").Value);
foreach (XElement c in list) {
int parentID = Int32.Parse(cat.Attribute("CatID").Value);
XElement sub = new XElement("sub",
from s in db.Categories
where s.CatTypeID.Equals(catTypeID) && s.ParentID.Equals(parentID)
select new XElement("Category",
s.CatID == null ? null : new XAttribute("CatID", s.CatID),
s.ParentID == null ? null : new XAttribute("ParentID", s.ParentID),
s.CatTitle == null ? null : new XAttribute("CatTitle", s.CatTitle),
s.CatTypeID == null ? null : new XAttribute("CatTypeID", s.CatTypeID),
s.shortDesc == null ? null : new XAttribute("shortDesc", s.shortDesc),
s.longDesc == null ? null : new XAttribute("longDesc", s.longDesc),
s.CatImage == null ? null : new XAttribute("CatImage", s.CatImage)));
c.Add(sub);
FillSubCatagories(c);
}
return cat;
}
Итак, проблема возникает, когда я пробегаю через foreach во второй раз через метод. On int parentID = Int32.Parse(cat.Attribute("CatID").Value);
возвращает исключение nullreferenceException - "ссылка на объект не установлена на экземпляр объекта"
Все еще привыкаю к c# родом с Явы, так что будь осторожен. Я уверен, что это вопиющая ошибка, но я не видел чистой причины, почему.
>>>>>>>>>>>>> ОТРЕДАКТИРОВАННЫЙ new FillSubCategories () выглядит следующим образом
private XElement FillSubCatagories(XElement cat) {
IEnumerable<XElement> list = cat.Descendants();
int catTypeID = cat.Attribute("CatTypeID") == null ? 1 : Int32.Parse(cat.Attribute("CatTypeID").Value);
foreach (XElement c in list) {
int parentID = Int32.Parse(c.Attribute("CatID").Value);
XElement sub = new XElement("sub",
from s in db.Categories
where s.CatTypeID.Equals(catTypeID) && s.ParentID.Equals(parentID)
select new XElement("Category",
s.CatID == null ? null : new XAttribute("CatID", s.CatID),
s.ParentID == null ? null : new XAttribute("ParentID", s.ParentID),
s.CatTitle == null ? null : new XAttribute("CatTitle", s.CatTitle),
s.CatTypeID == null ? null : new XAttribute("CatTypeID", s.CatTypeID),
s.shortDesc == null ? null : new XAttribute("shortDesc", s.shortDesc),
s.longDesc == null ? null : new XAttribute("longDesc", s.longDesc),
s.CatImage == null ? null : new XAttribute("CatImage", s.CatImage)));
c.Add(sub);
if (sub.Descendants() != null) {
FillSubCatagories(sub);
}
}
return cat;
}
Это продвинуло меня намного дальше, но я все равно попал в ноль.
РЕДАКТИРОВАТЬ РАБОЧИЙ МЕТОД
private void FillSubCategories(XElement cat) {
IEnumerable<XElement> list = cat.Descendants();
foreach (XElement c in list) {
try {
int catTypeID = Int32.Parse(c.Attribute("CatTypeID").Value);
int parentID = Int32.Parse(c.Attribute("CatID").Value);
XElement sub = new XElement("sub",
from s in db.Categories
where s.CatTypeID.Equals(catTypeID) && s.ParentID.Equals(parentID)
select new XElement("Category",
s.CatID == null ? null : new XAttribute("CatID", s.CatID),
s.ParentID == null ? null : new XAttribute("ParentID", s.ParentID),
s.CatTitle == null ? null : new XAttribute("CatTitle", s.CatTitle),
s.CatTypeID == null ? null : new XAttribute("CatTypeID", s.CatTypeID),
s.shortDesc == null ? null : new XAttribute("shortDesc", s.shortDesc),
s.longDesc == null ? null : new XAttribute("longDesc", s.longDesc),
s.CatImage == null ? null : new XAttribute("CatImage", s.CatImage)));
try {
string i = sub.Element("Category").Value;
c.Add(sub);
FillSubCategories(sub);
} catch (Exception) {
continue;
}
} catch (Exception) {
continue;
}
}
}
3 ответа:
Это выглядит не очень хорошо. Вы уверены, что есть вещи, которые не относятся ни к одной категории В вашей таблице? Если это так, вы не должны выбирать их, так как вы делаете все операции над categoryId. Я думаю, как упоминал Крис, вы получаете это исключение, потому что вы находитесь в родительской категории, у которой нет другого родителя. Вам нужно поставить условие if и не разбирать, если это родительская категория. Что-то вроде этого:
private XElement FillSubCatagories(XElement cat) { IEnumerable<XElement> list = cat.Descendants(); int catTypeID = c.Attribute("CatTypeID") == null ? 1 : Int32.Parse(cat.Attribute("CatTypeID").Value); foreach (XElement c in list) { if(!String.IsNullOrEmpty(cat.Attribute("CatID").Value)) { int parentID = Int32.Parse(cat.Attribute("CatID").Value); XElement sub = new XElement("sub", from s in db.Categories where s.CatTypeID.Equals(catTypeID) && s.ParentID.Equals(parentID) select new XElement("Category", s.CatID == null ? null : new XAttribute("CatID", s.CatID), s.ParentID == null ? null : new XAttribute("ParentID", s.ParentID), s.CatTitle == null ? null : new XAttribute("CatTitle", s.CatTitle), s.CatTypeID == null ? null : new XAttribute("CatTypeID", s.CatTypeID), s.shortDesc == null ? null : new XAttribute("shortDesc", s.shortDesc), s.longDesc == null ? null : new XAttribute("longDesc", s.longDesc), s.CatImage == null ? null : new XAttribute("CatImage", s.CatImage))); c.Add(sub); FillSubCatagories(c); } } return cat; }