当前位置:  开发笔记 > 编程语言 > 正文

C# ??结合?:问题

如何解决《C#??结合?:问题》经验,为你挑选了2个好方法。

我正在为一个项目构建一个XML Deserializer,我经常遇到这种类型的代码情况:

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

有没有更好的方式来写这个陈述?

编辑:也许我应该澄清我的例子,因为我有一个帮助方法来解析字符串为小数.



1> TcKs..:

您可以使用扩展方法:

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;
    }
}



2> Jon Skeet..:

编辑:鉴于编辑过的问题,这更简单.

它再次使用扩展方法,但现在不需要在方法中进行转换.

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"转换为十进制"操作.通用转换不会这样做,因为它不知道在编译时你想要什么样的转换.但是,您可以为您感兴趣的所有结果类型重载上述方法.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有