如何委托默认格式提供程序?

我想创建一个EscapingFormatProvider ,在返回之前自动HTML转义格式化字符串,除非格式参数以!开头:

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

我希望它传递格式参数,少了! 如果有,则为默认格式化程序。 唯一的麻烦是,我不知道如何获得默认的格式化程序。 我发现的所有示例都没有解决委派默认格式化程序的问题。

编辑:这是我提出的:

 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); } } 

这有点间接,但我认为它有效。

如果我正确理解你,你需要做的就是使用默认格式提供者调用不带IFormatProvider的string.Format的重载! 或者你的意思是“默认格式化程序”,还是你担心本地化?

正确的解决方案是重新实现默认格式化程序的function,具体如下:

 var formattable = arg as IFormattable; return formattable == null ? arg.ToString() : formattable.ToString(format, formatProvider); 

除此之外,如果ICustomFormatter是要求的类型,您的格式提供者应该只返回自己。

因此,在您的情况下,您的格式提供程序应如下所示:

 class EscapingFormatProvider : IFormatProvider, ICustomFormatter { public object GetFormat(Type formatType) { if (formatType == typeof(ICustomFormatter)) return this; return null; } public string Format(string format, object arg, IFormatProvider formatProvider) { var escape = false; if (format.StartsWith("!")) { escape = true; format = format.Substring(1); } var formattable = arg as IFormattable; var formatted = formattable == null ? arg.ToString() : formattable.ToString(format, formatProvider); return escape ? HttpUtility.HtmlEncode(formatted) : formatted; } }