2

次のメソッドがあるとします:(実際のメソッドにはさらにいくつかのパラメーターがありますが、重要なパラメーターは以下のとおりです...)

public string DoSomething(string formatter, params string[] values)
{
    // Do something eventually involving a call to String.Format(formatter, values);
}

値の配列にフォーマッターをカバーするのに十分なオブジェクトが含まれているかどうかを確認する方法はありますか?存在しない場合は例外をスローできます(string.Formatを実行する以外に、これは最後までオプションではありません)いくつかのラムダ変換のため)?

4

4 に答える 4

4

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も失敗します。

最近のプロジェクトで上記の前者のアプローチを使用したところ、うまくいきました。

于 2010-06-16T21:01:40.477 に答える
2

あなたはこれについてあまり心配していると思います。フォーマット文字列が無効な場合はstring.Format、例外をスローしてください。をスローしたくない場合はFormatException、それをキャッチして、必要な例外をスローします。

また、これは結局のところ例外的な状況であるため(ラムダ変換の評価など)、すでにいくつかの処理(ラムダ変換の評価など)を行っていることも実際には問題ではありません(ラムダが非常にコストがかかる場合を除いて、string.Format最初にテストを実行してください)。引数を処理せずに有効であることを確認し、後で処理する必要があるときに繰り返します)。

于 2010-06-16T21:17:52.373 に答える
0

テンプレートの数をカウントするには正規表現を使用しますが、注意してください。

string.Format("{0}{0}", 123)

有効です。

あなたは本当にこの質問に答えるためにもっと多くの情報を提供する必要があります...

于 2010-06-16T20:56:43.743 に答える
0

ブレースフォーマッタに対して正規表現を実行してから、それらを値配列の長さと比較することができます。

于 2010-06-16T20:59:25.017 に答える