Interpolation de chaîne dans Visual Studio 2015 et Formatprovider (CA1305)
Dim s = $"Hello {name}"
mais si je l'utilise l'analyse du code me dit que je casse CA1305: spécifiez IFormatProvider
Dans l'ancien temps, je l'ai fait comme ceci:
Dim s = String.Format(Globalization.CultureInfo.InvariantCulture, "Hello {0}", name)
<!-Mais comment faire avec le nouveau style?
<!-Je dois mentionner que je cherche une solution pour .Net 4.5.2 (pour .Net 4.6 dcastro a la réponse)
3 réponses
vous utiliseriez le System.FormattableString
ou System.IFormattable
catégorie:
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);
vous devez compiler par rapport au Cadre 4.6, comme le IFromattable
et FormattableString
sont des classes qui n'existent pas dans les anciennes versions. Donc si vous ciblez des versions plus anciennes du .net framework vous ne pouvez pas utiliser la syntaxe d'interpolation sans déclencher l'erreur.
sauf si vous appliquez un petit hack ( adapté pour compiler contre 4.6 RTM de Jon Skeet gist et fourche à mon propre compte.). Il suffit d'ajouter un fichier de classe à votre projet contenant:
mise à Jour
Il y a maintenant aussi un package Nuget disponibles qui peuvent fournir la même fonctionnalité à votre projet (merci de porter ceci à mon attention @habakuk).
install-package StringInterpolationBridge
ou si vous voulez réaliser la même chose sans ajouter d'assemblage supplémentaire à votre produit ajouter le code suivant à votre projet:
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);
}
}
}
Voir:
si vous ciblez le Framework .net 4.6, vous pouvez profiter du fait que les interpolations de chaînes sont implicitement convertibles en FormattableString
:
personnalisation de l'interpolation des chaînes en C# 6 par Thomas Levesque
un aspect moins connu de cette caractéristique est qu'une chaîne interpolée peut être traitée soit comme un
String
ou unIFormattable
, selon le contexte.
static string Invariant(FormattableString formattable)
{
return formattable.ToString(CultureInfo.InvariantCulture);
}
string text = Invariant($"{p.Name} was born on {p.DateOfBirth:D}");
j'ai trouvé un Nuget Package qui couvre le code jessehouwing présenté dans sa réponse.
le paquet Nuget 'StringInterpolationBridge' ( source) ajoute ce code à chaque projet.