C#??と組み合わせ ?:質問
-
22-08-2019 - |
質問
私はプロジェクト用に 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ます。