我当前的项目(C#3.5)有很多像这样的代码(elem是XElement的一个实例):
textbox1.Text = elem.Element("TagName") == null ? "" : elem.Element("TagName").Value;
有没有办法在不重复调用elem.Element()且不使用扩展方法的情况下编写相同的东西? 也许使用lambdas? (但我无法弄清楚如何。)
答案 0 :(得分:13)
XElement显式转换为实际调用.Value的String(和a bunch of other types)。 换句话说,你可以这样写:
var value = (String)elem.Element("TagName");
我认为如果实际元素也为空,这将返回null
-edit -
验证, 这是一个例子:
var x = new XElement("EmptyElement");
var n = (String)x.Element("NonExsistingElement");
在此之后 n
将为null。
答案 1 :(得分:7)
是。你可以这样写:
(string)elem.Element("TagName") ?? "";
这是 null合并运算符。
这意味着如果左侧不为空,则使用左侧。如果为null,则使用右侧。
答案 2 :(得分: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上提供了其他示例。
答案 3 :(得分:2)
一种疯狂的??
方法:
// make this a member-variable somewhere
var emptyElement = XElement.Parse("<x></x>");
(elem.Element("TagName") ?? emptyElement).Value;
会更喜欢扩展方法。
答案 4 :(得分:0)
与此类似,这与Xml布尔检查有关,这是我使用null合并运算符的解决方案:
Convert.ToBoolean(this.xDocument.Root.XPathSelectElement(@"/settings/checkbox[@name = 'MessageArrivedTimeCheckBox']").Value ?? "false");
原因是默认情况下将xml理解为字符串,其中存在类型解析问题,可以通过xml本身内的序列化参数来解决,但是我怀疑甚至有可能,因为它直到不了解为止运行。也许可以使用类型期望值对元素本身进行声明或赋值?
答案 5 :(得分:0)
这不适用于原始问题,但是由于似乎仍在积极查看此问题,因此这是C#6.0+项目的更新:
从C#6.0开始,使用空条件运算符(?.
)和空coalescing运算符(??
),您可以执行以下操作:
textbox1.Text = elem.Element("TagName")?.Value ?? "";
Cf。 Null-Conditional Operator Documentation和Null-Coalescing Operator Documentation。