我要建一个项目的XML解串器和我碰到这种类型的代码运行情况相当频繁:

var myVariable = ParseNDecimal(xml.Element("myElement")) == null ? 
                 0 : ParseNDecimal(xml.Element("myElement")).Value;

有没有更好的方式来写这个说法?

编辑:也许我应该澄清我的例子如我有一个辅助方法来分析字符串为十进制

有帮助吗?

解决方案

可以使用扩展方法:

public static T TryGetValue<T>( this XmlElement element ) {
    if ( null == element ) return default(T);
    return (T)element.Value;
}
...
...
var myVariable = xml.Element("myElement").TryGetValue<decimal>();

修改

“万能” 的解决方案:

static class Program {
    static void Main() {
        var xmlDecimal = new XElement( "decimal" );
        xmlDecimal.Value = ( 123.456m ).ToString();
        decimal valueOfDecimal_1 = xmlDecimal.ValueAs<decimal>( decimal.TryParse );
        bool valueOfBool_1 = xmlDecimal.ValueAs<bool>( bool.TryParse );

        var xmlBool = new XElement( "bool" );
        xmlBool.Value = true.ToString();
        decimal valueOfDecimal_2 = xmlBool.ValueAs<decimal>( decimal.TryParse );
        bool valueOfBool_2 = xmlBool.ValueAs<bool>( bool.TryParse );
    }
}

public static class StaticClass {
    public delegate bool TryParseDelegate<T>( string text, out T value );
    public static T ValueAs<T>( this XElement element, TryParseDelegate<T> parseDelegate ) {
        return ValueAs<T>( element, parseDelegate, default( T ) );
    }
    public static T ValueAs<T>( this XElement element, TryParseDelegate<T> 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“转换为十进制“运营商。一个普通的投不会那样做,因为它不知道你要在编译的时候是什么样的转换。你可以,但是,过载为你感兴趣的所有结果类型上面的方法。

可以使用??经营者多一点干净写这篇文章,但我不知道,你应该......

的存在具有该名称的子元素,所以这就是你可以使用Element()返回null?在默认元件滑动。你需要做这个之前(decimal)投的调用:

var myVariable 
    = (decimal)(xml.Element("myElement") ?? new XElement("myElement", 0));

就像我,虽然说,虽然这会的工作,我不知道你的的做到这一点。 YMMV。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top