Frage

Ich baue eine XML-Deserializer für ein Projekt und ich auf diese Art von Code Situation laufe ziemlich oft:

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

Gibt es einen besseren Weg, um diese Aussage zu schreiben?

EDIT:. Vielleicht sollte ich mein Beispiel geklärt haben, wie ich eine Hilfsmethode zu tun haben die Zeichenfolge in eine Dezimalzahl zu analysieren

War es hilfreich?

Lösung

Sie können Erweiterungsmethode verwenden:

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>();

EDIT:

Die "universelle" Lösung:

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

Andere Tipps

Edit:. die editierte Frage gegeben, das ist viel einfacher

Auch hier verwendet es eine Erweiterungsmethode, aber jetzt gibt es keine Notwendigkeit, eine Umwandlung in dem Verfahren zu tun.

var myVariable = ParseNDecimal(xml.Element("myElement").ValueOrDefault("0"));

...

public static string ValueOrDefault(this XElement element, 
                                     string defaultValue)
{
    return element != null ? element.Value : defaultValue;
}

Wenn Sie nicht die Methode, wie ein String-Parameter nehmen, man könnte es object dauern und ToString nennen, dann rufen Sie wie folgt aus:

var myVariable = ParseNDecimal(xml.Element("myElement").ValueOrDefault(0m));

Aber das fühlt sich ein wenig falsch zu mir. Er geht davon aus, dass die Analyse wird die Umkehrung der ToString Formatierung sein.

Original Antwort

Es gibt nichts besonders in der Sprache zu helfen. (Ich bin nicht sicher, dass Sie den genauen Code Recht haben - Sie bedeuten nicht, etwas mit einem XAttribute?) Ich würde vorschlagen, ein Dienstprogramm Methode schreiben:

var myVariable = xml.Element("myElement").ValueOrDefault(0m);

...

public static decimal ValueOrDefault(this XElement element, 
                                     decimal defaultValue)
{
    return element != null ?(decimal) element.Value : defaultValue;
}

Wenn Sie den Code in der Frage einstellen, werde ich hier für den Code ebenfalls tun. Ich vermute, Sie haben bedeutet XAttribute zu verwenden, die mit Generika zu einem Problem führt - ich habe nicht die oben in allgemeiner Weise geschrieben, weil ich glaube, Sie wollen die XAttribute „Umwandlung rufen in Dezimalzahlen " Operator. Eine generische Besetzung wird das nicht tun, da sie nicht wissen, welche Art von Konvertierung Sie bei der Kompilierung mögen. Sie können jedoch überlasten das obige Verfahren für alle Ergebnistypen Sie interessiert sind.

Sie können die Verwendung ?? Betreiber schreiben dies ein wenig sauberer, aber ich bin mir nicht sicher, dass Sie sollten ...

Element() gibt null zurück, der kein Element mit diesem Namen Kind ist, so das ist, wo Sie nutzen könnten ?? in einem Standardelement zu gleiten. Sie müssen diese vor dem Aufruf der (decimal) Besetzung tun:

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

Wie ich aber sagte, während dies funktionieren wird, ich bin nicht sicher, dass Sie sollte tun. YMMV.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top