たとえば、decimal
をstring
に変換する場合はCultureInfo.InvariantCulture
を使用し、IFormatProvider
として渡します。しかし、なぜこの過負荷はobject
にありませんか?オブジェクトにIFormatProviderを受け入れるオーバーロードがないのはなぜですか?
素敵な実装は次のようになります。
public virtual string ToString()
{
// yadayada, usual ToString
}
public virtual string ToString(IFormatProvider provider)
{
return ToString();
}
これはobject
クラスに害や利益を生じないだろうが、そこから派生するオブジェクトではなく、過負荷を上書きすることができ、ときにそれを呼び出すことは非常に簡単になりますあなたはそのタイプが不明です。
私がこの問題に遭遇したのは、クラスのすべてのプロパティを取得してxmlに書き込むメソッドを作成したときでした。オブジェクトのタイプを確認したくないので、私はちょうどToString
を呼び出しました。しかし、これは小数であったでしょうか?出力は最適ではないスレッドのCurrentCulture
に基づいています。私が見ることができる唯一の回避策は、InvariantCulture
にCurrentCulture
を変更して、元の状態に戻すことです。
foreach (var property in typeof(Order).GetProperties(BindingFlags.Public | BindingFlags.Instance).
Where(c => ValidTypes.Contains(c.PropertyType)))
{
var value = property.GetValue(order, null);
if (value != null)
{
writer.WriteElementString(property.Name,
value.ToString());
}
}
しかし、私はそれになりたいでしょう:しかし、私はfinallyブロックを試し書きしなければならないとして、それはちょうど
など醜いだろう私の現在のコードがある foreach (var property in typeof(Order).GetProperties(BindingFlags.Public | BindingFlags.Instance).
Where(c => ValidTypes.Contains(c.PropertyType)))
{
var value = property.GetValue(order, null);
if (value != null)
{
writer.WriteElementString(property.Name,
value.ToString(CultureInfo.InvariantCulture));
}
}
任意の利益object
にこのオーバーロードがないのはどうですか?
'IConvertible'が実際に(あなたが番号をフォーマットすることを計画していない限り。)より理にかなって – dlev
@ dlev:私は同意しません - OPは具体的には*フォーマットするだけです。型が簡単にIFormattableを実装することはできますが、IConvertibleは実装できないこと、そしてIFormattableの1つのメソッドがOPが呼びたいものと同じであることを考えれば、IFormattableは理にかなっています。 –
@Jon OPの質問によれば、実際には 'Toon()'の 'IConvertible'バージョンを使っている経験があるようです。あなたのポイントは、しかし、撮影されています。 – dlev