5

EscapingFormatProviderformat 引数が ! で始まらない限り、フォーマットされた文字列を返す前に自動的に HTML エスケープする

string.Format(new EscapingFormatProvider(), "<div>{0}</div>", "<script src='foo'></script>");
// => <div>&lt;script src='foo'&gt;&lt;/script&gt;</div>

string.Format(new EscapingFormatProvider(), "<div>{0:!}</div>", "<script src='foo'></script>");
// => <div><script src='foo'></script></div>

フォーマット引数を渡したいのですが、! ある場合は、デフォルトのフォーマッタに。唯一の問題は、デフォルトのフォーマッタを取得する方法がわからないことです。私が見つけた例のどれも、デフォルトのフォーマッターへの委譲の問題に対処していません。

編集:これは私が思いついたものです:

private class EscapingFormatProvider : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType) { return this; }

    private string DefaultFormat(string format, object arg)
    {
        return string.Format("{0:" + format + "}", arg);
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        return (format.First() == '!')
            ? HttpUtility.HtmlEncode(DefaultFormat(format.Substring(1), arg))
            : DefaultFormat(format, arg);
    }
}

少し間接的ですが、うまくいくと思います。

4

2 に答える 2

1

私があなたを正しく理解しているなら、デフォルトのフォーマットプロバイダーを使用するためにあなたがする必要があるのは、IFormatProviderをとらないstring.Formatのオーバーロードを呼び出すことだけです!それとも、「デフォルトのフォーマッター」とは別の意味ですか、それともローカリゼーションについて心配していますか?

于 2012-07-11T17:36:24.087 に答える