質問

私はプロジェクト用に XML デシリアライザーを構築しているのですが、この種のコード状況にかなり頻繁に遭遇します。

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

このステートメントを書くより良い方法はありますか?

編集 :おそらく、文字列を 10 進数に解析するヘルパー メソッドがあるので、例を明確にする必要がありました。

役に立ちましたか?

解決

拡張メソッドを使用できます。

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 「10進数への変換」演算子。汎用キャストでは、コンパイル時にどのような変換が必要かわからないため、これは行われません。ただし、関心のあるすべての結果タイプに対して上記のメソッドをオーバーロードできます。

あなたが使用することができます?もう少しきれいにこれを書いたが、私はあなたがする必要があることはよく分からないオペレータ...

あなたが使用できるところそれはですので、その名前の子要素が存在しないのElement()はnullを返します?デフォルトの要素にスライドします。あなたは前(decimal)キャストの呼び出しにこれを実行する必要があります:

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

私は、これは動作しますが、私はあなたがをすることをわからない、しかし言ったように、のこの操作を行う必要があります。 YMMVます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top