9 votes

Vérification de la nullité d'un XElement

Mon projet actuel (C# 3.5) comporte beaucoup de code comme celui-ci (elem est une instance de XElement) :

textbox1.Text = elem.Element("TagName") == null ? "" : elem.Element("TagName").Value;

Existe-t-il un moyen d'écrire la même chose sans répéter un appel elem.Element() et sans utiliser les méthodes d'extension ? Peut-être en utilisant des lambdas ? (Mais je n'arrive pas à trouver comment).

15voto

aL3891 Points 3353

XElement dispose d'une conversion explicite en String (et en un tas d'autres types ) qui appellera réellement .Value. En d'autres termes, vous pouvez écrire ceci :

var value = (String)elem.Element("TagName");

Je pense que cela retournera null si l'élément actuel est null aussi.

-edit-

vérifié, voici un exemple :

 var x = new XElement("EmptyElement");
 var n = (String)x.Element("NonExsistingElement");

n sera nulle après cela.

7voto

Øyvind Bråthen Points 25211

Oui, tu peux l'écrire comme ça :

(string)elem.Element("TagName") ?? "";

C'est le opérateur de coalescence nul .

Cela signifie que si le côté gauche n'est pas nul, alors utilisez le côté gauche. S'il est nul, il faut utiliser le côté droit.

2voto

VMAtm Points 8401

Il existe un excellent article sur le CodeProject pour de telles actions : http://www.codeproject.com/KB/cs/maybemonads.aspx

public static TResult With<TInput, TResult>(this TInput o, 
       Func<TInput, TResult> evaluator)
       where TResult : class where TInput : class
{
  if (o == null) return null;
  return evaluator(o);
}

string valueEl = this.With(x => elem.Element("TagName")
                  .With(x => x.Value);

D'autres exemples sont disponibles sur le CodeProject.

2voto

Marcel Jackwerth Points 20632

Un fou ?? approche :

// make this a member-variable somewhere
var emptyElement = XElement.Parse("<x></x>");

(elem.Element("TagName") ?? emptyElement).Value;

J'aurais cependant préféré une méthode d'extension.

0voto

Andrew Ramshaw Points 213

J'ai une situation similaire à celle-ci qui concerne les vérifications booléennes en Xml et c'est la solution que j'ai trouvée en utilisant l'opérateur de coalescence nul :

Convert.ToBoolean(this.xDocument.Root.XPathSelectElement(@"/settings/checkbox[@name = 'MessageArrivedTimeCheckBox']").Value ?? "false");

La raison est que le xml est compris par défaut comme une chaîne de caractères avec des problèmes de résolution de type qui peuvent être résolus par des paramètres de sérialisation dans le xml lui-même, mais je doute que cela soit possible car il ne le comprend pas avant l'exécution. Peut-être y a-t-il une déclaration ou une affectation qui peut être faite avec l'élément lui-même avec une attente de type ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X