c# - net - Interpolación de cadenas en Visual Studio 2015 e IFormatProvider(CA1305)
net core string format (3)
El nuevo estilo de interpolación de cadenas en Visual Studio 2015 es este:
Dim s = $"Hello {name}"
Pero si uso esto, el análisis de código me dice que rompo CA1305: Especifique IFormatProvider
En los viejos tiempos lo hice así:
Dim s = String.Format(Globalization.CultureInfo.InvariantCulture, "Hello {0}", name)
Pero, ¿cómo se puede hacer con el nuevo estilo?
Debo mencionar que estoy buscando una solución para .Net 4.5.2 (para .Net 4.6 dcastro tiene la respuesta )
He encontrado un Nuget-Package que cubre el código que Jessehouwing presentó en su respuesta .
El paquete Nuget ''StringInterpolationBridge'' ( source ) agrega este código a cada proyecto.
Si tiene como objetivo .NET Framework 4.6, puede aprovechar el hecho de que las interpolaciones de cadenas son implícitamente convertibles a FormattableString
:
Desde personalizar la interpolación de cadenas en C # 6 por Thomas Levesque
Un aspecto menos conocido de esta característica es que una cadena interpolada se puede tratar como una
String
, o como unIFormattable
, dependiendo del contexto.
static string Invariant(FormattableString formattable)
{
return formattable.ToString(CultureInfo.InvariantCulture);
}
string text = Invariant($"{p.Name} was born on {p.DateOfBirth:D}");
Utilizarías la clase System.FormattableString
o System.IFormattable
:
IFormattable ifs = (IFormattable)$"Hello, {name}";
System.FormattableString fss = $"Hello, {name}";
// pass null to use the format as it was used upon initialization above.
string ifresult = ifs.ToString(null, CultureInfo.InvariantCulture);
string fsresult = fss.ToString(CultureInfo.InvariantCulture);
IFromattable
compilar contra Framework 4.6, ya que IFromattable
y FormattableString
son clases que no existen en versiones anteriores. Por lo tanto, si se dirige a versiones anteriores de .NET Framework, no puede usar la sintaxis de interpolación sin desencadenar el error.
A menos que apliques un pequeño truco ( adaptado para compilar contra 4.6 RTM de la esencia de Jon Skeet y bifurcado a mi propia cuenta ). Simplemente agregue un archivo de clase a su proyecto que contenga:
Actualizar
Ahora también hay disponible un paquete de Nuget que proporcionará la misma funcionalidad para su proyecto (gracias por informarme de esto @habakuk).
install-package StringInterpolationBridge
O si desea lograr lo mismo sin agregar un ensamblaje adicional a su producto, agregue el siguiente código a su proyecto:
namespace System.Runtime.CompilerServices
{
internal class FormattableStringFactory
{
public static FormattableString Create(string messageFormat, params object[] args)
{
return new FormattableString(messageFormat, args);
}
}
}
namespace System
{
internal class FormattableString : IFormattable
{
private readonly string messageFormat;
private readonly object[] args;
public FormattableString(string messageFormat, object[] args)
{
this.messageFormat = messageFormat;
this.args = args;
}
public override string ToString()
{
return string.Format(messageFormat, args);
}
public string ToString(string format, IFormatProvider formatProvider)
{
return string.Format(formatProvider, format ?? messageFormat, args);
}
public string ToString(IFormatProvider formatProvider)
{
return string.Format(formatProvider, messageFormat, args);
}
}
}
Ver: