Interpolation de chaîne dans Visual Studio 2015 et Formatprovider (CA1305)

<!-Le nouveau style d'interpolation des chaînes de caractères dans Visual Studio 2015 est le suivant:

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)

28
demandé sur habakuk 2015-08-18 18:39:15

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:

21
répondu jessehouwing 2015-08-26 10:01:22

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 un IFormattable, selon le contexte.

static string Invariant(FormattableString formattable)
{
    return formattable.ToString(CultureInfo.InvariantCulture);
}

string text = Invariant($"{p.Name} was born on {p.DateOfBirth:D}");
12
répondu dcastro 2015-08-18 15:51:10

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.

4
répondu habakuk 2015-08-24 12:58:34