Нулевая проверка на XElement - PullRequest
8 голосов
/ 23 мая 2011

В моем текущем проекте (C # 3.5) много такого кода (elem является экземпляром XElement):

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

Есть ли способ написать то же самое без повторения вызова elem.Element () и без использования методов расширения? Может быть, используя лямбды? (Но я не могу понять, как.)

Ответы [ 4 ]

13 голосов
/ 23 мая 2011

XElement имеет явное преобразование в String (и кучу других типов ), которые фактически вызовут .Value.Другими словами, вы можете написать это:

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

Я думаю, что это вернет ноль, если фактический элемент также нулевой

-edit-

проверено, вотпример:

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

n будет нулевым после этого.

7 голосов
/ 23 мая 2011

Да.Вы можете написать это так:

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

Это оператор объединения нулей .

Это означает, что если левая часть не равна нулю, то используйтелевая сторона.Если он нулевой, используйте правую часть.

2 голосов
/ 23 мая 2011

Безумный ?? подход:

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

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

Хотя бы предпочел метод расширения.

2 голосов
/ 23 мая 2011

На CodeProject есть отличная статья для таких действий: 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);

Другие примеры доступны в CodeProject.

...