我当前的项目(C#3.5)有很多这样的代码(elem是XElement的一个实例:]
textbox1.Text = elem.Element("TagName") == null ? "" : elem.Element("TagName").Value;
是否有任何方法可以编写相同的东西而无需重复调用elem.Element()且不使用扩展方法?也许使用lambdas? (但我不知道如何。)
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
之后将为空。
是。您可以这样写:
(string)elem.Element("TagName") ?? "";
这是空合并运算符。
这意味着如果左侧不为null,则使用左侧。如果为null,请使用右侧。
[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本身内的序列化参数来解决,但是我怀疑那是否可能,因为直到运行时它才理解。也许可以使用类型期望值对元素本身进行声明或赋值?