9
votes

Chèque null sur xelement

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

existe-t-il un moyen d'écrire la même chose sans répéter un appel Elem.Element () et sans utilisation de méthodes d'extension? Peut-être utiliser Lambdas? (Mais je ne peux pas comprendre comment.)


2 commentaires

Pourquoi voulez-vous éviter les méthodes d'extension si c'est exactement un cas d'utilisation pour eux? Alternative (le Java-Way) serait de définir une méthode statique quelque part, et utilisez-le: elemehelper.valueordfault (elem, "tagname", "") .


@Marcel Jackwerth je veux juste savoir s'il y a d'autres façons :)


6 Réponses :


7
votes

Oui. Vous pouvez l'écrire comme ceci:

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


4 commentaires

Vous n'avez pas lu la question. Si elem.Element ("TAMNAME")! = NULL, nous avons besoin de l'élève.Element ("TagName"). Valeur, non elem.Element ("TagName")


@Vmatm - Je l'ai relu maintenant. Je ne vois toujours pas ce que vous vous plaignez ici. Pouvez-vous s'il vous plaît donner plus d'informations sur ce que vous voulez dire est faux ici?


ØYVind: la pièce après le : a un supplémentaire . Je suis tombé dans le même piège.


@Vmatm & @joey - Je n'ai pas vu celui-ci. Corrigé ma réponse maintenant. Vérifié sur mon propre système.



15
votes

xelement a une conversion explicite en chaîne (et groupe d'autres types ) qui effectivement appeler .value. Dans d'autres mots, vous pouvez écrire ceci:

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


3 commentaires

Donc, juste pour l'indiquer - la solution complète serait (string) elem.Element ("TAGName") ?? ""; .


Merci! Je pense que je vais rester avec cette solution.


Grands trucs, me sauvent un chèque null à chaque fois!



2
votes

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


1 commentaires

J'ai modifié (amélioré?) Cette réponse en supprimant la contrainte de classe sur le type Tresult et en retournant par défaut (Tresult) au lieu de NULL.



2
votes

Un APPROCHE CODE> APPROCHE:

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

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


0 commentaires

0
votes

Vous avez une situation similaire à ce que cela concerne les chèques Boolean XML et c'était ma résolution qui a utilisé l'opérateur de coalescence null:

convert.tobooloan (this.xdocument.root.xpathelectelement (@ "/ paramètres / case à cocher [@Name = 'MessageArriVedtimecheckbox']") "). Valeur ??" Faux ");

La raison étant que le XML est compris par défaut comme une chaîne avec des problèmes de résolution de type pouvant être résolvables via des paramètres de sérialisation dans le XML lui-même, mais je doute même que ce serait possible car il ne comprend pas que Durée. Peut-être qu'il y a une déclaration ou une affectation qui peut être faite avec l'élément lui-même avec l'attente de type?


0 commentaires

0
votes

Cela ne s'applique pas à la question initiale, mais comme il semble que cette question soit toujours vue activement, il s'agit d'une mise à jour des projets C # 6.0+:

Depuis C # 6.0, à l'aide de l'opérateur non conditionnel (? Documentation de l'opérateur null-conditionnel et Documentation de l'opérateur null-coalescente .


0 commentaires