XElement上的空检查

本文关键字:检查 XElement | 更新日期: 2023-09-27 17:57:29

我当前的项目(C#3.5)有很多这样的代码(elem是XElement的一个实例):

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

有没有办法写同样的东西而不重复调用elem。Element(),而不使用扩展方法?也许用lambdas?(但我不知道怎么做。)

XElement上的空检查

XElement有一个显式转换为String(以及一堆其他类型),它将实际调用.Value。换句话说,你可以这样写:

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

我认为,如果实际元素也是空的,也会返回空

-编辑-

经验证,这里有一个例子:

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

在此之后,n将为空。

是。你可以这样写:

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

这是空合并运算符

这意味着,如果左手边不为空,则使用左手边。如果它为空,则使用右手边。

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上提供了其他示例。

一种疯狂的??方法:

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

不过我更喜欢扩展方法。

有类似的情况,这与Xml布尔检查有关,这是我使用null合并运算符的解决方案:

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

原因是xml默认情况下被理解为字符串,存在类型解析问题,这些问题可以通过xml本身中的序列化参数来解决,但我怀疑这是否可能,因为它直到运行时才理解它。也许有一个声明或赋值可以用具有类型期望的元素本身来完成?

这不适用于最初的问题,但由于这个问题似乎仍然被积极查看,这是C#6.0+项目的更新:

从C#6.0开始,使用null条件运算符(?.)和null合并运算符(??),您可以执行以下操作:

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

参见。Null条件运算符文档和Null合并运算符文档。