2011-01-16 4 views
3

J'ai le code suivant.XElement NullReferenceException

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

Maintenant, si l'élément est nulle, je reviens, je reçois un NullReferenceException depuis le XElement est nulle. Donc, je l'ai changé à la suivante.

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

J'espère qu'il doit y avoir un moyen de faire plus élégant ce depuis ce scénario arrive souvent et je voudrais éviter de faire ce type de contrôle chaque fois qu'il ya un problème. Toute aide serait grandement appréciée

+0

est "pas vraiment, il suffit de cocher pour null" une réponse valide ? Je pense qu'une partie significative de notre travail est des chèques nuls ... – Kobi

Répondre

2

Vous pouvez écrire un extension method et l'utiliser partout:

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

utiliser comme:

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

vous pouvez également ajouter d'autres extensions pour votre but.

Edit: j'avais mis à jour la réponse, mais si vous le lire attentivement avant d'écrire, vous pouvez add other extensions for your purpose. j'ai écrit parce que je suppose que vous voulez peut-être faire appel à des objets null Element, je ne sais pas quelle est la situation exacte de votre mais j'ajoute du code pour plus de clarification, dépendez de votre situation complète la classe XDocumentExtension, et les méthodes d'extension d'une note peuvent travailler sur les objets nuls.

+0

Merci, mais j'ai l'impression que cette réponse fonctionne si l'élément est valide. Quand je fais ceci si opCoOptOff est nul, j'obtiendrai toujours une exception nullreference. – Ken

+0

@Ken, voir mes mises à jour. –

+0

Merci beaucoup. Je me rends compte que j'ai laissé le code supplémentaire qui tentait de fonctionner sur un objet nul. Je pense que je devrais pouvoir l'obtenir d'ici. Je vous remercie beaucoup pour votre aide. – Ken

1

Vous pouvez réellement jeté le XElement directement à une chaîne: http://msdn.microsoft.com/en-us/library/bb155263.aspx

si

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

pourrait être

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

Ceci est le même problème, 'opCoOptOff' sera toujours nul, en jetant un' NRE' –

+0

oui, mon utilisation est légèrement différente si j'accède à l'élément est une ligne en utilisant Descendants (...). FirstOrDefault, puis coulée directement que à une chaîne. Ça marchera. –