我正在为一个项目构建一个XML Deserializer,我经常遇到这种类型的代码情况:
var myVariable = ParseNDecimal(xml.Element("myElement")) == null ? 0 : ParseNDecimal(xml.Element("myElement")).Value;
有没有更好的方式来写这个陈述?
编辑:也许我应该澄清我的例子,因为我有一个帮助方法来解析字符串为小数.
您可以使用扩展方法:
public static T TryGetValue( this XmlElement element ) { if ( null == element ) return default(T); return (T)element.Value; } ... ... var myVariable = xml.Element("myElement").TryGetValue ();
编辑:
"通用"解决方案:
static class Program { static void Main() { var xmlDecimal = new XElement( "decimal" ); xmlDecimal.Value = ( 123.456m ).ToString(); decimal valueOfDecimal_1 = xmlDecimal.ValueAs( decimal.TryParse ); bool valueOfBool_1 = xmlDecimal.ValueAs ( bool.TryParse ); var xmlBool = new XElement( "bool" ); xmlBool.Value = true.ToString(); decimal valueOfDecimal_2 = xmlBool.ValueAs ( decimal.TryParse ); bool valueOfBool_2 = xmlBool.ValueAs ( bool.TryParse ); } } public static class StaticClass { public delegate bool TryParseDelegate ( string text, out T value ); public static T ValueAs ( this XElement element, TryParseDelegate parseDelegate ) { return ValueAs ( element, parseDelegate, default( T ) ); } public static T ValueAs ( this XElement element, TryParseDelegate parseDelegate, T defaultValue ) { if ( null == element ) { return defaultValue; } T result; bool ok = parseDelegate( element.Value, out result ); if ( ok ) { return result; } return defaultValue; } }
编辑:鉴于编辑过的问题,这更简单.
它再次使用扩展方法,但现在不需要在方法中进行转换.
var myVariable = ParseNDecimal(xml.Element("myElement").ValueOrDefault("0")); ... public static string ValueOrDefault(this XElement element, string defaultValue) { return element != null ? element.Value : defaultValue; }
如果您不喜欢使用字符串参数的方法,您可以进行object
调用ToString
,然后调用它,如下所示:
var myVariable = ParseNDecimal(xml.Element("myElement").ValueOrDefault(0m));
但是,这对我来说有点不对劲.它假定解析将与ToString
格式化相反.
原始答案
语言中没有什么特别可以帮助你的.(我不确定你是否拥有正确的代码 - 难道你的意思不是XAttribute
吗?)我建议你写一个实用的方法:
var myVariable = xml.Element("myElement").ValueOrDefault(0m); ... public static decimal ValueOrDefault(this XElement element, decimal defaultValue) { return element != null ?(decimal) element.Value : defaultValue; }
如果你调整问题中的代码,我会在这里为代码做同样的事情.我怀疑你没有吝啬使用XAttribute
,这导致使用泛型一个问题-我没有写在上面的一个通用的方法,因为我相信你会要拨打的XAttribute
"转换为十进制"操作.通用转换不会这样做,因为它不知道在编译时你想要什么样的转换.但是,您可以为您感兴趣的所有结果类型重载上述方法.