明示的なフォーマットプロバイダーの受け渡しを維持しながら、冗長性の低下につながるほとんど唯一の代替手段は、カルチャ固有のファサードメソッドを使用することです。幸いなことに、通常はInvariantCultureとCurrentCultureのフォーマットのみであるため、基礎となるフォーマットメソッドごとに2つのファサードメソッドのみが必要になります。
サンプルコードの一般的なファサードメソッドには、次のような署名があります。
public static string FormatForInvariantCulture(this string template, params object[] substitutions)
そして次のように呼ばれます:
"{0} - {1}".FormatForInvariantCulture(id, name);
ファサードメソッドを整理するための別のアプローチは、IoC技術を使用して注入できる文化固有のフォーマッタータイプになります。たとえば、次のようなインターフェイスをフォーマット用に定義できます。
public interface IFormatter
{
string Format(string template, params object[] substitutions);
}
次に、カルチャ固有のインスタンスを、次のようなコンストラクターを使用してフォーマットを実行する必要があるタイプに注入できます。
public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter)
{
// ...
}
ファサードメソッドのパッケージ化方法に関係なく、CA2241(ProvideCorrectArgumentsToFormattingMethods)はメソッドの使用法を調べないことを考慮することが重要です。そのため、カスタムルールを追加することを検討する価値があるかもしれません。