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有一个显式转换为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合并运算符文档。