EscapingFormatProvider
format 引数が ! で始まらない限り、フォーマットされた文字列を返す前に自動的に HTML エスケープする
string.Format(new EscapingFormatProvider(), "<div>{0}</div>", "<script src='foo'></script>");
// => <div><script src='foo'></script></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);
}
}
少し間接的ですが、うまくいくと思います。