对XElement进行空检查

问题描述 投票:8回答:5

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

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

是否有任何方法可以编写相同的东西而无需重复调用elem.Element()且不使用扩展方法?也许使用lambdas? (但我不知道如何。)

c# xml linq-to-xml
5个回答
13
投票

XElement具有对String(和a bunch of other types)的显式转换,它将实际调用.Value。换句话说,您可以这样写:

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

我认为如果实际元素也为null,则此方法将返回null

-编辑-

已验证,这是一个例子:

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

[n之后将为空。


7
投票

是。您可以这样写:

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

这是空合并运算符

这意味着如果左侧不为null,则使用左侧。如果为null,请使用右侧。


2
投票

[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上找到。


2
投票

疯狂的??方法:

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

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

虽然会更喜欢使用扩展方法。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.