.NET Framework のフォーマット インフラストラクチャの設計を誤解しているようです。ICustomFormatter
の実装内では絶対に参照しないでください。これIFormattable.ToString
は、そのインターフェイスの意図した目的と衝突するためです。
IFormattable
オブジェクトは、それ自体をフォーマットする方法を知っている場合にのみ実装する必要がありIFormattable
ます (理想的には、もちろんそれを別のクラスに委譲する必要がありますが、ここでは意図的な結合があります)。オブジェクトは、複数の異なる方法で自分自身をフォーマットする方法を知っている場合があるため、フォーマット文字列を使用してそれらの中から選択できます。それでも、文化によって異なるなど、まだ情報が不足している可能性があります。したがって、このような情報を間接的に提供する 2 番目のパラメーターがあります。
に渡される型は、が提供されIFormatProvider.GetFormat
たクラスに固有の型またはインターフェイスであることを意図しています。IFormatProvider
たとえば、組み込みの数値型は のインスタンスを取得できるようにする必要がありますがSystem.Globalization.NumberFormatInfo
、DateTime
関連するクラスは を取得できるようにする必要がありますSystem.Globalization.DateTimeFormatInfo
。
実装中IFormattable
では、新しい自己書式設定クラスを作成しているとしましょう。自分自身をフォーマットする方法が 1 つしかわかっていない場合は、単にオーバーライドするだけobject.ToString()
で、それ以上のことは何もしません。クラスが自分自身をフォーマットする複数の方法を知っている場合は、 を実装する必要がありますIFormattable
。
format
パラメータ_
(一般的な形式を表す)の形式文字列のドキュメントごとにサポートする必要があります。null または空の書式文字列は、書式文字列の と同等にすることをお勧めします。それ以外の場合、正確な意味は私たち次第です。IFormattable.ToString
"G"
"G"
formatProvider
パラメータ_
文化固有の何かが必要な場合、またはそれ以外の場合は異なる場合は、IFormatProvider
パラメーターを利用する必要があります。を使用してリクエストするタイプがありますIFormatProvider.GetFormat
。が nullの場合IFormatProvider
、または必要なIFormatProvider.GetFormat
型に対して null を返す場合は、このさまざまな情報についてデフォルトのソースにフォールバックする必要があります。
デフォルトのソースは静的である必要はありません。デフォルトのソースはアプリのユーザー設定である可能性があり、formatProvider
オプションの変更をプレビューしたり、シリアル化に固定形式が必要な場合に使用されます。
また、フォーマットに一部のサブオブジェクトのフォーマットが含まれる可能性もあります。その場合、おそらくIFormatProvider
ダウンを渡したいでしょう。MSDN には、まさにこのケースを示す優れた実装例があります。IFormattable
その他のToString
オーバーロード
実装するときは、次と同等の方法でオーバーライドするIFormattable
ことが重要ですObject.ToString()
public override string ToString()
{
return this.ToString(null, System.Globalization.CultureInfo.CurrentCulture);
}
そうすることで、somestring + yourobject
が と同等であることが保証string.Format("{0}{1}",somestring, yourobject)
されます。これは、ユーザーが真であると期待するものです。
ユーザーの利便性のために、おそらく提供する必要がありますstring ToString(string format)
。また、既定の形式に の恩恵を受けるさまざまなコンポーネントがあるIFormatProvider
場合は、 も提供することをお勧めしますpublic string ToString(IFormatProvider provider)
。
ICustomFormatter
では、それ自体をフォーマットする方法がわからないクラスをフォーマットしたい場合、またはクラス自体でサポートされていないフォーマットを使用したい場合はどうすればよいでしょうか。そこで、ICustomFormatter が重要になります。IFormatProvider
型を提供できる は、や などのメソッドでパラメーターICustomFormatter
として渡すことができます。IFormatProvider
string.Format
StringBuilder.AppendFormat
提供されICustomFormatter
ているには、Format
フォーマットを行うたびに呼び出されるメソッドがstring.Format
あります。ICustomFormatter
が使用されているフォーマット文字列に慣れていない場合、またはその型をサポートしていない場合は、単にIFormattable.ToString
orに委譲しObject.ToString
ます。このICustomFormatter
ドキュメントには、フォーマット サポートをまだ提供していないオブジェクトをフォーマットする場合に必要なものと、既存の .xml ファイルに別のフォーマットを追加するだけの場合に必要なもののリストが記載されていますIFormattable
。また、追加のフォーマット ケースを追加する例も示します。
参照
この MSDN ページでは、.NET フォーマット システムの優れた概要を提供し、MSDN の他のほとんどすべての関連ページへのリンクを提供します。フォーマット関連のほぼすべての質問を開始するのに最適な場所です。