2011-01-16 2 views
3

У меня есть следующий код.XElement NullReferenceException

XElement opCoOptOff = doc.Descendants(ns + "OpCoOptOff").FirstOrDefault(); 
String opCo = opCoOptOff.Element(ns + "strOpCo").Value; 

Теперь, если элемент я возвращаюсь пустой, я получаю NullReferenceException поскольку XElement является недействительным. Поэтому я изменил его на следующее.

String opCo = opCoOptOff.Element(ns + "strOpCo").Value; 
if(opCoOptOff != null) 
     { 
String opCo = opCoOptOff.Element(ns + "strOpCo").Value; 

Я надеюсь, там должен быть более элегантным способом сделать это, так как этот сценарий приходит часто, и я хотел бы, чтобы не делать этот тип проверки каждый раз, когда есть проблема. Любая помощь будет принята с благодарностью

+0

"не очень, просто проверить нулевой" действительный ответ ? Я думаю, что значительная часть нашей работы - это нулевые проверки ... – Kobi

ответ

2

Вы можете написать extension method и использовать его в любом месте:

public static class XDocumentExtension 
{ 
    public static string GetSubElementValue(this XElement element, string item) 
    { 
     if(element != null && element.Value != null) 
     { 
      if (element.Element(item) != null) 
      { 
       return element.Element(item).Value; 
      } 
     } 
     return null; 
    } 

    public static XElement GetElement(this XElement element, string item) 
    { 
     if (element != null) 
      return element.Element(item); 

     return null; 
    } 

    public static XElement GetElement(this XDocument document, string item) 
    { 
     if (document != null) 
      return document.Descendants("item").FirstOrDefault(); 
     return null; 
    } 
} 

Используйте его как:

String opCo = opCoOptOff.Element(ns + "strOpCo").GetSubElementValue(ns + "strOpCo"); 

Также вы можете добавить другие расширения для вашей цели.

Edit: Я обновил ответ, но если вы внимательно его прочитать, прежде чем я написал вы можете add other extensions for your purpose. я написал это, потому что я думаю, вы можете быть хотите вызвать на нуль объектов Element, я не знаю, что это точная ситуация , но я добавлю код для более подробного разъяснения, в зависимости от вашей ситуации завершите класс XDocumentExtension, а один метод расширения заметок может работать с нулевыми объектами.

+0

Спасибо, но я чувствую, что этот ответ работает, если элемент действителен. Когда я это сделаю, если opCoOptOff равно null, я все равно получаю исключение nullreference. – Ken

+0

@ Ken, см. Мои обновления. –

+0

Большое вам спасибо. Я понимаю, что оставил дополнительный код, который пытался работать с нулевым объектом. Думаю, я смогу получить его отсюда. Большое вам спасибо за вашу помощь. – Ken

1

Вы можете на самом деле бросить XElement непосредственно в строку: http://msdn.microsoft.com/en-us/library/bb155263.aspx

так

String opCo = opCoOptOff.Element(ns + "strOpCo").Value; 

может быть

string opCo = (string) opCoOptOff.Element(ns + "strOpCo"); 
+0

Это та же проблема, 'opCoOptOff' будет по-прежнему иметь значение null, бросая 'NRE' –

+0

да, мое использование немного отличается от того, что я получаю доступ к элементу - это одна строка с использованием Descendants (...). FirstOrDefault, а затем прямое литье к строке. Это будет работать. –

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

  • Нет связанных вопросов^_^