フォーマッタ文字列で交換の数を伝えるにはどうすればよいですか?
-
27-09-2019 - |
質問
次の方法を考慮してください:(実際の方法にはさらにいくつかのパラメーターがありますが、重要な方法は以下にあります...)
public string DoSomething(string formatter, params string[] values)
{
// Do something eventually involving a call to String.Format(formatter, values);
}
私の値アレイにフォーマッタをカバーするのに十分なオブジェクトがあるかどうかを判断する方法はありますか?いくつかのラムダ変換のため)?
解決
なぜあなたが使用できないと思うのかはまだ明確ではありません string.Format
それをテストします。フォーマッタで合格したものが、値のアイテムのプレースホルダーを持つことになっている場合、これを行うことができるはずです。
static void TestFormat(string formatter, params string[] values)
{
try
{
string.Format(formatter, values);
}
catch (FormatException e)
{
throw new Exception("the format is bad!!", e);
}
}
サンプルの使用法:
TestFormat("{0}{1}{2}", "a", "b", "c"); // works ok
TestFormat("{0}{1}{2}", "a", "b"); // throws exception
TestFormat("{0}{1}{2}}0{", "a", "b", "c"); // throws exception
正規表現でこれをやろうとするのは難しいでしょう。なぜなら、このようなことはどうだから
"{0}, {1}, {abc}, {1a4} {5} }{"
{abc}
と {1a4}
有効ではありません string.Format
, 、また、有効な番号ごとに決定する必要があります({0}, {1}, {5}
)少なくとも多くの議論があること。また、 }{
String.Formatも失敗します。
私は最近のプロジェクトで上記の以前のアプローチを使用したばかりで、うまくいきました。
他のヒント
あなたはこれについてあまりにも心配していると思います。フォーマット文字列が無効な場合は、 string.Format
あなたのために例外を投げます。あなたが欲しくない場合 FormatException
投げられるには、それをキャッチして、あなたが望む例外を投げます。
また、実際に何らかの処理を行っていること(例えば、ラムダ変換の評価)を行っていることも問題ではないはずです。これは結局のところ 例外的な状況 (おそらく例外を除いて、ラムダは非常に費用がかかりますが、その場合は string.Format
最初に処理せずにテストして、それが有効であることを確認し、処理後に後で必要なときに繰り返します)。
正規表現を使用してテンプレートの数をカウントしますが、注意してください。
string.Format("{0}{0}", 123)
有効です。
あなたは本当にこの質問に答えられるためにもっと情報を提供する必要があります...
ブレースフォーマッタの正規表現を行い、値アレイの長さと比較できます。